[英]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 ,它仍然是模棱兩可的。 出於這個原因,我建議作為一般指導:如果一個類中有多個具有相同名稱的方法(包括從基類繼承的方法):
我們不能通過使用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.