调用带有空参数的任意对象的方法引用时发生NullPointerException

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任何地方使用参考文件也会发生这种情况吗?

Swe*_*per 6

我认为您误解了这一行的含义:

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是实例方法的声明类型。