sjn*_*ngm 2 java generics lambda
这是我的代码的缩短示例,以证明我的观点:
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;
}
};
}
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,编译器应该看到,V在createCheck()应该String从吸气剂的功能,这就是为什么要抱怨的INT到来.或者相反.
那为什么这会编译?
你的签名是:
private <T, V> BiPredicate<T, String> createCheck(Function<T, V> func, V value) {
Run Code Online (Sandbox Code Playgroud)
你没有任何界限T或V绝对任何值T或V编译.
然而,你返回一个BiPredicate<T, String>,所以该isEqualTo方法接受String ref并比较它的相等性Object value- 这也是完全合法的,因为我认为isEqualTo它需要Object模仿行为Object.equals.
在你的例子中:
createCheck(X::getStr, 123);
Run Code Online (Sandbox Code Playgroud)
V简单地说Object,这是可以应用于String和的最紧密的类型绑定Integer.
你的意思是:
private <T> BiPredicate<T, String> createCheck(Function<T, String> func, String value) {
Run Code Online (Sandbox Code Playgroud)