2
これが私のポイントを証明するために私のコードの短縮サンプルです:ラムダとジェネリックス:これはなぜコンパイルされますか?
public class Tmp {
static class X {
void setStr(String blah) {
}
String getStr() {
return null;
}
}
public void test() {
createCheck(X::getStr, ""); // supposed to compile
createCheck(X::getStr, 123); // rather not: int isn't String
}
private <T, V> BiPredicate<T, String> createCheck(Function<T, V> func, V value) {
return new BiPredicate<T, String>() {
@Override
public boolean test(T t, String ref) {
assertThat(func.apply(t))
.as(ref)
.isEqualTo(value);
return true;
}
};
}
}
IMHO、コンパイラはcreateCheck()
でV
が、それは文句を言う必要がある理由ですゲッター機能から来るString
でなければならないことがわかりますint。または、それ以外の方法です。
これはなぜコンパイルされますか?
、はい、 "平均します"。しかし、その後、私は 'value'として渡す型ごとにメソッドをコーディングする必要があります。そして、それは私がやるべきことではありません... – sjngm
あなたは@sjngmをやろうとしていますが、私はそれを安全に行う方法が見えません。 ' BiPredicate createCheck(関数 func、V値)'を試すことができますが、これは明らかに元のメソッドとは異なる戻り値を持っています。これは、2番目のケースでは 'BiPredicate 'となります。それはあなたが探しているコンパイルエラーを引き起こす可能性があります... –
いいえ、 'BiPredicate'は 'test()'のパラメータに影響します。 –
sjngm