Java 8功能接口分配上下文

Sub*_*der 6 java java-8

问题是关于功能界面的分配背景 -

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有强大的输入,不支持鸭子打字.