19

Java 8 の新機能について学びます。

私はさまざまな例で遊んでいますが、奇妙な動作を見つけました:

public static void main(String[] args) {       
    method(Test::new);
}
static class Test{
}

private static void method(Supplier<Test> testSupplier){
    Test test = testSupplier.get();
}

このコードは正常にコンパイルされますが、どのように機能するかわかりません。

Test::newサプライヤーとして受け入れられるのはなぜですか?

サプライヤーのインターフェースは非常にシンプルに見えます:

@FunctionalInterface
public interface Supplier<T> {    
    T get();
}
4

3 に答える 3

3

Function引数が必要な場合は、サプライヤではなく である可能性があります。ただし、メソッド参照は、メソッドを参照するのと同じ方法でコンストラクターを参照できます。彼らは面白い名前を持っています(new)。

Java チュートリアルには、次の 4 種類のメソッド参照があります。

種類の例
------------------------------- ------------------- -----------------
静的メソッドへの参照 ContainingClass::staticMethodName
Object::instanceMethodName を含むインスタンス メソッドへの参照
特定のオブジェクトの  
インスタンス メソッドへの参照 ContainingType::methodName
の任意のオブジェクトの
特定のタイプ
コンストラクタ ClassName::new への参照
于 2015-09-21T20:31:45.017 に答える