我理解错误信息.我知道我无法在静态上下文中访问非静态方法.但为什么我可以做到以下几点:
Predicate<String> t = String::isEmpty; // this works
Run Code Online (Sandbox Code Playgroud)
当isEmpty()是String类的非静态方法时?查看以下示例类.我理解不允许TestLamba :: isEmptyTest的逻辑; 但我不明白为什么String:isEmpty可以打破这个规则:
import java.util.function.Predicate;
public class TestLamba {
public static void main(String... args) {
Predicate<String> t = String::isEmpty; // this works
Predicate<String> t2 = TestLamba::isEmptyTest; // this doesn't
}
public boolean isEmptyTest() {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是String.isEmpty的源代码.这是一种非常常见的方法,您可以看到它不是静态的:
public boolean isEmpty() {
return this.value.length == 0;
}
Run Code Online (Sandbox Code Playgroud)
isEmpty是StringClass isEmptyTest的功能,是TestLamba 类的功能 .
import java.util.function.Predicate;
public class TestLamba {
public static void main(String... args) {
Predicate<String> t = String::isEmpty; // this works
Predicate<TestLamba > t2 = TestLamba::isEmptyTest; //Now this will work
}
public boolean isEmptyTest() {
return true;
}
}
Run Code Online (Sandbox Code Playgroud)