问题是关于功能界面的分配背景 -
Predicate<String> p = String::isEmpty;
Run Code Online (Sandbox Code Playgroud)
isEmpty在String类中的方法声明为 - 的情况下工作正常public boolean isEmpty(){}.
如果我尝试在自定义类中声明相同 -
class Test{
public boolean isEmpty(){
...
}
}
Run Code Online (Sandbox Code Playgroud)
做同样的任务 -
Predicate<String> p = Test::isEmpty;
Run Code Online (Sandbox Code Playgroud)
这将是编译错误 -
Test类型没有定义适用于此的isEmpty(String)
并且Predicate<T>表示一个参数的谓词(布尔值函数)和函数方法boolean test(T t){}.
任何解释?我错过了什么吗?
m3t*_*man 10
你应该有:
Predicate<Test> p = Test::isEmpty;
Run Code Online (Sandbox Code Playgroud)
并不是
Predicate<String> p = Test::isEmpty;
Run Code Online (Sandbox Code Playgroud)
没有字符串
class Test {
public boolean isEmpty(){
...
}
}
Run Code Online (Sandbox Code Playgroud)
那为什么要这样Predicate<String>呢?
请参阅方法参考教程.你在这里有第三种情况"引用特定类型的任意对象的实例方法".
有
Predicate<String> p = String::isEmpty();
String s = "";
Run Code Online (Sandbox Code Playgroud)
调用p.test(s);与callign相同,s.isEmpty();这就是为什么你不能作为参数a String来调用方法Test.
Predicate如果两者都有共同点String并且Test可以实现Empty与该方法的接口boolean isEmpty()然后具有Predicate<Empty>.然后这两个p.test(string)和p.test(test)会的工作; 否则它不会,Java有强大的输入,不支持鸭子打字.