2013-06-22 90 views
3

我瞭解C#擴展方法,因爲它們允許您將新方法添加到已經關閉的類定義中。 Java後衛/擴展方法似乎完全不同。例如:Java中擴展方法的實際用法是什麼?

public interface Interfacable { 
    public void regular(); 
    public default void defender() { System.out.println("I am protected"); }; 
} 

好了,所以我得到的,你可以做「特質Y」與Java擴展方法的東西,但我不明白爲什麼它被稱爲同樣的事情(「擴展」),如果它似乎呃,不是做同樣的事情。有人可以幫我解決這個問題嗎?

+0

這不能編譯。有面向方面編程(AOP),這聽起來像你想要的,但不是。 – SJuan76

+0

應該嗎?你在使用Java-8嗎? – sircodesalot

+1

不,Java 7是最後一個發佈的。如果你想討論Java 8,你應該在問題中指定。 – SJuan76

回答

5

這些被添加的原因是爲Java添加閉包的一部分,所以有一個簡單的升級路徑來收集類的東西。添加閉包的挑戰是現在有很多你想要添加到標準集合的函數。但是,如果將這些添加到現有接口中,則會破壞這些接口的任何實現。解決這個問題的方法是爲新方法添加一個額外的接口。這可能沒有虛擬擴展方法,然而,它有它自己的缺點。也就是說,新界面的實現需要在可以使用之前添加。由於今天可能有很多實現可能需要很長時間才能升級所有這些實現。但是,同時你想添加的方法對實現來說是不可知的。他們應該做基本相同的事情,至少在基本情況下。構建它的團隊決定處理案例的方式是啓用可以被覆蓋的默認行爲的規範。通過添加接口,這種方式的功能就在那裏,由圖書館編寫者決定他們想寫一個不同的實現。關鍵是他們不需要,或者直到他們這樣做纔有停止差距功能。

很長一段時間他們基本上行爲像特徵,你是正確的,他們不是在C#中的擴展方法同樣的事情。從我讀過的這個原始實現是更多的C#。但是,由於風格的限制(即無法覆蓋功能)以及無法使用反射而決定使用這些方法會發現它們。看起來這個名字被卡住了,儘管實施的方法改變了。

查看write-up解釋虛擬擴展方法的全部細節。

+2

我想現在它簡單地稱爲「默認方法」 – ZhongYu

相關問題