簡體   English   中英

Java 8對靜態方法與實例方法的引用

[英]Java 8 reference to a static method vs. instance method

說我有以下代碼

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 :: is類型表示法引用實例方法版本? 非常感謝

在您的示例中,靜態和非靜態方法都適用於過濾器方法的目標類型。 在這種情況下,您不能使用方法引用,因為無法解決歧義。 有關詳細信息,請參見§15.13.1 方法參考的編譯時聲明 ,特別是以下引用和以下示例:

如果第一次搜索產生靜態方法,並且沒有適用的非靜態方法[..],則編譯時聲明是第一次搜索的結果。 否則,如果沒有靜態方法適用[..],並且第二次搜索產生非靜態方法,則編譯時聲明是第二次搜索的結果。 否則,沒有編譯時聲明。

在這種情況下,您可以使用lambda表達式而不是方法引用:

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

關於搜索靜態和非靜態方法的上述規則有點特殊,因為無關緊要,哪種方法更適合。 即使靜態方法采用Object而不是A ,它仍然是模棱兩可的。 出於這個原因,我建議作為一般指導:如果一個類中有多個具有相同名稱的方法(包括從基類繼承的方法):

  • 所有方法都應該具有相同的訪問修飾符,
  • 所有方法都應該具有相同的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();

謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM