Java 8对静态方法与实例方法的引用

Java 8对静态方法与实例方法的引用,java,java-8,java-stream,method-reference,Java,Java 8,Java Stream,Method Reference,假设我有以下代码 public class A { int x; public boolean is() {return x%2==0;} public static boolean is (A a) {return !a.is();} } 在另一节课上 List<A> a = ... a.stream().filter(b->b.isCool()); a.stream().filter(A::is); //would be equivalent i

假设我有以下代码

public class A {
    int x;
    public boolean is() {return x%2==0;}
    public static boolean is (A a) {return !a.is();}
}
在另一节课上

List<A> a = ...
a.stream().filter(b->b.isCool());
a.stream().filter(A::is); 
//would be equivalent if the static method is(A a) did not exist
列表a=。。。
a、 stream().filter(b->b.isCool());
a、 stream().filter(a::is);
//如果静态方法(A)不存在,则等效

问题是如何使用A::is类型表示法引用实例方法版本?非常感谢

我们不能通过使用className::methodName符号来使用非静态方法或非全局方法。 如果要使用特定类的方法,必须有该类的实例

So if you want to access is() method then you can use : 
A a = new A();
a.is();
OR 
(new A()).is();

谢谢。

在您的示例中,静态和非静态方法都适用于筛选方法的目标类型。在这种情况下,您不能使用方法引用,因为无法解决歧义。详情见§15.13.1,特别是以下引用和示例:

如果第一次搜索产生一个静态方法,并且没有非静态方法可应用[…],那么编译时声明就是第一次搜索的结果。否则,如果没有适用的静态方法[…],并且第二次搜索生成非静态方法,则编译时声明是第二次搜索的结果否则,没有编译时声明。

在这种情况下,可以使用lambda表达式而不是方法引用:

a.stream().filter(item -> A.is(item));
上面关于搜索静态和非静态方法的规则有些特殊,因为这无关紧要,哪种方法更适合。即使静态方法将采用对象而不是对象,它仍然是不明确的。因此,我建议作为一般准则:如果一个类中有多个同名的方法(包括从基类继承的方法):

  • 所有方法都应具有相同的访问修饰符
  • 所有方法都应具有相同的最终和抽象修饰符
  • 所有方法都应该有相同的静态修饰符

您的意思是如果两个方法都存在,如何调用实例方法?编译器错误是:“对is的引用不明确,两个方法在A中都是(A),方法在匹配中是()。显然,编译器不能在这里做出决定。我打赌您最好的选择是将符号更改为lambda表达式以使其变得明显。