Я хочу преобразовать anonymous class
в lambda expression
. Но этот анонимный класс я использует ключевое слово this
.
Например, я написал этот простой шаблон Observer/Observable
:
import java.util.ArrayList;
import java.util.Collection;
public static class Observable {
private final Collection<Observer> notifiables = new ArrayList<>();
public Observable() { }
public void addObserver(Observer notifiable) { notifiables.add(notifiable); }
public void removeObserver(Observer notifiable) { notifiables.add(notifiable); }
public void change() {
notifiables.forEach(notifiable -> notifiable.changed(this));
}
}
public interface Observer {
void changed(Observable notifier);
}
и этот пример кода с анонимным классом (используйте это ключевое слово):
public class Main {
public static void main(String[] args) {
Observable observable = new Observable();
observable.addObserver(new Observer() {
@Override
public void changed(Observable notifier) {
notifier.removeObserver(this);
}
});
observable.change();
}
}
но когда я преобразую его в выражение лямбда:
public class Main {
public static void main(String[] args) {
Observable observable = new Observable();
observable.addObserver(notifier -> { notifier.removeObserver(this); });
observable.change();
}
}
Я получаю эту ошибку компиляции:
Cannot use this in a static context and in a non `static` context
public class Main {
public void main(String[] args) {
method();
}
private void method() {
Observable observable = new Observable();
observable.addObserver(notifier -> {
notifier.removeObserver(this);
});
observable.change();
}
}
ошибка компиляции:
The method removeObserver(Main.Observer) in the type Main.Observable is not applicable for the arguments (Main)
Итак, мой вопрос: Есть ли способ ссылаться на "лямбда-объект" с помощью this
?