根据编译器,这是有效的代码:
BiPredicate<String, String> bp = String::equalsIgnoreCase;
但是如果我制作自己的 BiPredicate,它无法编译..为什么?
private void run() {
BiPredicate<String, String> bp = String::equalsIgnoreCase; // compiles!
BiPredicate<String, String> bp2 = MyKlazz::m1; // does not compile!
}
static final class MyKlazz<T, U> {
private T t;
MyKlazz(T t){
this.t = t;
}
public boolean m1(U u){
System.out.println("in m1.. t: " + this.t + ", u: " + u);
return true; // dummy
}
}
A
BiPredicate
接受两个参数并返回 boolean
。这就是为什么 String::equalsIgnoreCase
与它兼容。您的方法 MyKlass::m1
仅采用一个参数。它可以是 Predicate
,但不是 BiPredicate
。
此外,它是一个实例方法,因此方法引用必须是
MyKlass
的实例,而不是静态方法引用,例如:
MyKlass<String, String> myklass = new MyKlass<String, String>("a string");
Predicate<String> predicate = myklass::m1;