考虑以下课程:
class Foo<T> {
void handle(T t) {
System.out.println("handling " + t);
}
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
Foo<Integer> f = new Foo<>();
list.forEach(f::handle); // compiles fine
//list.forEach(obj -> f.handle(obj));// compilation error
f = new Foo<>(); // reassign f
}
}
为什么我会为obj -> f.handle(obj)
而不是出现编译错误f::handle
?
那些是两种不同的构造,它们在做两种不同的事情。在第一种情况下,您将获得特定对象的方法引用:只需执行一次,此后JVM便拥有对对象的自己的引用(实际上是最终的引用),f
并且可以调用该handle
方法。在第二种情况下,在每次调用时,JVM必须解析f
引用,因此它抱怨f
必须是final
。你可以很容易地编写代码集f
,以null
同时forEach
运行,从而导致一个NPE。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句