我想转换一个
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);
}
和带有匿名类的此示例代码(使用this关键字):
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();
}
}
但是当我将其转换为lambda表达式时:
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)
所以我的问题是:
Is there a way to reference the "lambda object" with
this
?
最新回答
- 2021-1-111 #
相关问题
- lambda:Java 8方法参考未处理的异常javalambdajava82021-01-12 00:58
- java lambda返回一个lambdajavalambdafunctionalprogrammingjava82021-01-11 16:55
- java:功能界面,不带任何内容,不返回任何内容javafunctionjava82021-01-11 16:57
您不能引用
this
在lambda表达式中.this
的语义 已更改为仅从lambda内部引用周围类的实例.没有办法引用lambda表达式的this
从lambda内部。问题是您使用
this
在main()
方法.主要方法是静态的,没有引用代表this
的对象使用
this
时 在内部类的实例内部,您引用的是内部类的实例。 Lambda表达式不是内部类,this
未引用lambda表达式的实例.它引用的是您在其中定义lambda表达式的类的实例。在您的情况下,它将是Main的实例.但是,由于您使用的是静态方法,因此没有实例。这是第二个编译错误告诉您的内容.您将Main实例移交给您的方法.但是您的方法签名需要一个Observer实例。
Update:
Java语言规范15.27.2说:
h 解决方法1您的
解决方法2change()
方法抛出ConcurrentModificationException
无论如何。我改变了
changed(Observable)
到changed(Observable, Observer)
这样观察者就可以处理自己。