为什么在静态上下文中无法引用非静态方法时,String :: isEmpty有效?

Mar*_*o L 3 java java-8

我理解错误信息.我知道我无法在静态上下文中访问非静态方法.但为什么我可以做到以下几点:

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)

Kha*_*hah 6

isEmptyStringClass 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)

  • 没有意识到泛型参数是引用类。谢谢! (2认同)