Dies ist eine verkürzte Probe meines Codes mein Punkt zu beweisen:Lambda und Generics: Warum kompiliert sich das?
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 sollte der Compiler, dass V
in createCheck()
String
aus der Getter-Funktion kommen sollte, weshalb es über die sich beschweren sollte int. Oder umgekehrt.
Warum also kompiliert?
Nun, "mittlere", ja. Aber dann müsste ich eine Methode für jeden Typ kodieren, den ich als "value" übergeben möchte. Und das ist nicht das, was ich vorhatte ... – sjngm
Ich kann sehen, was Sie versuchen, @sjngm zu tun, aber ich sehe keinen Weg, es sicher zu machen. Sie könnten versuchen, BiPredicate createCheck (Funktion func, V-Wert) '- aber das hat offensichtlich eine andere Rückkehr zu Ihrer ursprünglichen Methode. Dies würde im zweiten Fall zu einem "BiPredicate" führen; Es kann die Kompilierungsfehler verursachen, nach denen Sie suchen ... –
Nein, 'BiPredicate ' wirkt sich auf die Parameter von 'test()' aus. – sjngm