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

说我有以下代码

public class A { int x; public boolean is() {return x%2==0;} public static boolean is (A a) {return !a.is();} } 

而在另一堂课……

 List 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 :: is类型表示法引用实例方法版本? 非常感谢

在您的示例中,静态和非静态方法都适用于filter方法的目标类型。 在这种情况下,您不能使用方法引用,因为无法解决歧义。 有关详细信息,请参见§15.13.1 方法参考的编译时声明 ,特别是以下引用和下面的示例:

如果第一次搜索产生静态方法,并且没有适用的非静态方法[..],则编译时声明是第一次搜索的结果。 否则,如果没有静态方法适用[..],并且第二次搜索产生非静态方法,则编译时声明是第二次搜索的结果。 否则,没有编译时声明。

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

 a.stream().filter(item -> A.is(item)); 

关于搜索静态和非静态方法的上述规则有点特殊,因为无关紧要,哪种方法更适合。 即使静态方法采用Object而不是A ,它仍然是模棱两可的。 出于这个原因,我建议作为一般指导:如果一个类中有多个具有相同名称的方法(包括从基类inheritance的方法):

  • 所有方法都应该具有相同的访问修饰符,
  • 所有方法都应该具有相同的final和abstract修饰符,
  • 并且所有方法都应该具有相同的静态修饰符

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

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

谢谢。