mrboieng:
私は、任意のオブジェクトへのメソッド参照を作成しようとしていたので、私は、次のタイプを定義しました:
interface I {
boolean get(Impl impl);
}
static class Impl {
public boolean get() {
return true;
}
}
それから私は、以下のようなメソッド参照を、宣言しました:
I i = Impl::get;
私は呼び出すと:
i.get(null);
私は、NullPointerExceptionが出ます:
Exception in thread "main" java.lang.NullPointerException
これにもかかわらず、なぜ起こるか誰かは説明できImpl
参照がどこにも使用されていませんか?
スイーパー:
私はあなたがこの行の意味を誤解だと思います。
I i = Impl::get;
I
かかる方法表す機能インタフェースであるImpl
と戻りboolean
、一方、get
はパラメータ戻るとらない方法があるがboolean
。どのようにこの変換作業をしますか?まあ、コンパイラの実現get
であるインスタンスメソッド、およびあなたが必要とする必要があり、それを呼び出すためにImpl
オブジェクトを。それが呼び出される前に、ちょうど関数のようにパラメータを持っていることではないですか?
コンパイラは喜んであなたが意味することを推測することができるように:
I i = impl -> impl.get();
今NPEの原因は明らかです。
一般的に、すべてのインスタンスメソッドは、型の1つの追加のパラメータを取る静的メソッド、と考えることができ、そのインスタンスメソッドの宣言型です。T
T