Yevhenii Smyrnov:
私たちは、このコードを持っています:
public class Test {
public static Object foo() {
System.out.println("Foo");
return new Object();
}
public static void main(String[] args) {
J j = Test::foo;
j.m();
}
}
interface J {
void m();
}
そして、このコードは動作します。重要なラインです
J j = Test::foo;
けれどもinterface J
、それは持って宣言するvoid
機能を、Test::foo
返しますObject
。
インターフェイスを実装しながら、我々は(明らかである)メソッドをオーバーライドすることはできませんが。インタフェースのメソッドがある場合にのみ動作しvoid
、それ以外のコードはコンパイルされません。それが動作する方法で、この作業を行い、なぜ誰かが教えてもらえますか?:D
アンドリューTobilko:
けれども
interface J
、それは持って宣言するvoid
機能を、Test::foo
返しますObject
。
これは、と言うことは不正確だTest::foo
戻って何かを。異なる文脈では、それは別のものを意味するかもしれません。
Supplier<Object> a = Test::foo;
J b = Test::foo;
Runnable c = Test::foo;
それはつまり、より正確だTest::foo
表現できるターゲット型に 機能する方法を返すのいずれかのvoid
かをObject
。
それはの例です式文(JLS-14.8) 。
ターゲット・タイプの関数型がある場合は
void
リターンを、そしてラムダ体のいずれかである文の式(§14.8)または無効互換ブロック(§15.27.2)。
...
式文は式を評価することによって実行されます。式が値を持っている場合、値は破棄されます。