の入力引数が同じ型の2つの引数を生成するbuildBiFxnWithSameTypeArgs
というメソッドを記述したいとします。 (buildBiFxnWithSameTypeArgs
が呼び出されたときに)いつも知られていません。つまり、buildBiFxnWithSameTypeArgs
によって返された関数が呼び出されるたびに、コンパイラが提供する引数の型が一致している必要があります。最終的な効果は、本質的には、メソッド定義の2つの引数の型に同じジェネリック型のパラメータを使用することに相当するラムダでなければなりません。汎用型パラメータで制約されたパラメータ型のラムダ関数を返す
私の最初の試みは、次のようになります。
public interface ConstrainedBiFunction<I, O> extends BiFunction<I, I, O> {}
public static ConstrainedBiFunction<?, String> buildBiFxnWithSameTypeArgs() {
return (inputOne, inputTwo) -> String.valueOf(inputOne) + String.valueOf(inputTwo);
}
public void test() {
buildBiFxnWithSameTypeArgs().apply(Integer.valueOf(1), Integer.valueOf(2));
}
ワイルドカード型パラメータ?
がこの方法で使用することはできません、しかし、表示されます。コンパイルが次のエラーでapply
ステップで失敗:
apply (capture<?>, capture<?> in BiFunction cannot be applied to (java.lang.Integer, java.lang.Integer)
は、それは、そのパラメータの型推論されているラムダ関数を返すことが可能であり、その後、このように互いに対して制約?
EDIT:非常に良い質問に対する謝罪。私はここで最も簡単な質問をするために本質を捉えようとしていたより複雑な問題を抱えていましたが、問題をあまりにも単純化したようです。私はもちろん、すべてのクラスがObject
から継承していることを認識していますので、この問題を過度に単純化して解釈すると、@shmoselと@JB Nizetが提案する解決策が働きます。私は元の問題を蒸留してより良い仕事をしたら、新しい質問を投稿します。
どのようにConstrainedBiFunction , String>が' '.apply(Integer.valueOf(1)、Integer.valueOf(2))に関し、'思いを行うことができますか? – Savior
すべてのクラスは最終的にObjectから継承されるため、たとえばバナナやトラックなどを渡しても、型を明示的に指定しない限り、コンパイラはConstrainedBuFunction