なぜvoidを返す型方式との機能のインターフェースはどんなリターン型方式を受け入れていますか?

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)。
...
式文は式を評価することによって実行されます。式が値を持っている場合、値は破棄されます。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=313465&siteId=1