mrb*_*eng 7 java method-reference
我试图创建对任意对象的方法引用,因此定义了以下类型:
interface I {
boolean get(Impl impl);
}
static class Impl {
public boolean get() {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我声明了方法引用,如下所示:
I i = Impl::get;
Run Code Online (Sandbox Code Playgroud)
当我打电话时:
i.get(null);
Run Code Online (Sandbox Code Playgroud)
我得到了NullPointerException:
Exception in thread "main" java.lang.NullPointerException
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么即使没有在Impl任何地方使用参考文件也会发生这种情况吗?
我认为您误解了这一行的含义:
I i = Impl::get;
Run Code Online (Sandbox Code Playgroud)
I是一个功能接口,表示一个采用a Impl并返回a 的方法boolean,而getis一个不采用任何参数并返回a的方法boolean。这种转换如何运作?好了,编译器意识到这get是一个实例方法,要调用它,您需要一个Impl对象。难道就不像函数在调用之前就具有参数一样?
因此,编译器可以愉快地推断出您的意思是:
I i = impl -> impl.get();
Run Code Online (Sandbox Code Playgroud)
现在,NPE的原因应该清楚了。
在一般情况下,所有实例方法可以被看作是一个需要额外的参数,类型的静态方法,T这里T是实例方法的声明类型。
| 归档时间: |
|
| 查看次数: |
51 次 |
| 最近记录: |