94

サプライヤが引数なしのコンストラクタのみをサポートするのはなぜですか?

デフォルトのコンストラクターが存在する場合は、次のようにできます。

create(Foo::new)

しかし、唯一のコンストラクターが文字列を取る場合、私はこれをしなければなりません:

create(() -> new Foo("hello"))
4

8 に答える 8

83

ただし、引数が 1 のコンストラクターTは、Stringと互換性がありFunction<String,T>ます。

Function<String, Foo> fooSupplier = Foo::new;

どのコンストラクターが選択されるかは、ターゲット型の形状に基づいて、オーバーロード選択の問題として扱われます。

于 2015-07-07T00:56:46.507 に答える
66

これは、メソッド参照構文の単なる制限であり、引数を渡すことはできません。それは構文がどのように機能するかです。

于 2015-07-06T17:23:15.077 に答える
55

メソッド参照が好きなら、bind自分でメソッドを書いて使うことができます:

public static <T, R> Supplier<R> bind(Function<T,R> fn, T val) {
    return () -> fn.apply(val);
}

create(bind(Foo::new, "hello"));
于 2015-07-07T02:54:36.717 に答える
14

サプライヤが引数なしのコンストラクタでしか動作しないのはなぜですか?

引数が 1 つのコンストラクターは、 のように 1 つの引数と 1 つjava.util.function.Function<T,R>の戻り値を持つ SAM インターフェイスと同型であるためR apply(T)です。

一方、Supplier<T>'sT get()は引数ゼロのコンストラクターと同形です。

それらは単に互換性がありません。create()メソッドは、さまざまな関数インターフェイスを受け入れ、提供される引数に応じて異なる動作をするためにポリモーフィックである必要があるか、2 つのシグネチャ間のグルー コードとして機能するラムダ ボディを記述する必要があります。

ここで満たされていない期待は何ですか?あなたの意見では何が起こるべきですか?

于 2015-07-06T18:03:49.470 に答える