为什么 String::equalsIgnoreCase 是 Java 中的 BiPredicate,但我自定义的 BiPredicate 无法编译

问题描述 投票:0回答:1

根据编译器,这是有效的代码:

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 
    }
}
java functional-programming
1个回答
0
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.