サプライヤが引数なしのコンストラクタのみをサポートするのはなぜですか?
デフォルトのコンストラクターが存在する場合は、次のようにできます。
create(Foo::new)
しかし、唯一のコンストラクターが文字列を取る場合、私はこれをしなければなりません:
create(() -> new Foo("hello"))
サプライヤが引数なしのコンストラクタのみをサポートするのはなぜですか?
デフォルトのコンストラクターが存在する場合は、次のようにできます。
create(Foo::new)
しかし、唯一のコンストラクターが文字列を取る場合、私はこれをしなければなりません:
create(() -> new Foo("hello"))
ただし、引数が 1 のコンストラクターT
は、String
と互換性がありFunction<String,T>
ます。
Function<String, Foo> fooSupplier = Foo::new;
どのコンストラクターが選択されるかは、ターゲット型の形状に基づいて、オーバーロード選択の問題として扱われます。
これは、メソッド参照構文の単なる制限であり、引数を渡すことはできません。それは構文がどのように機能するかです。
メソッド参照が好きなら、bind
自分でメソッドを書いて使うことができます:
public static <T, R> Supplier<R> bind(Function<T,R> fn, T val) {
return () -> fn.apply(val);
}
create(bind(Foo::new, "hello"));
サプライヤが引数なしのコンストラクタでしか動作しないのはなぜですか?
引数が 1 つのコンストラクターは、 のように 1 つの引数と 1 つjava.util.function.Function<T,R>
の戻り値を持つ SAM インターフェイスと同型であるためR apply(T)
です。
一方、Supplier<T>
'sT get()
は引数ゼロのコンストラクターと同形です。
それらは単に互換性がありません。create()
メソッドは、さまざまな関数インターフェイスを受け入れ、提供される引数に応じて異なる動作をするためにポリモーフィックである必要があるか、2 つのシグネチャ間のグルー コードとして機能するラムダ ボディを記述する必要があります。
ここで満たされていない期待は何ですか?あなたの意見では何が起こるべきですか?