2013-05-07 120 views
59

我是新來的斯卡拉開始學習語言的樂趣,我仍然試圖讓我的頭靠近它。我對Scala特性的理解是它們就像java接口,只是有些方法可以實現。Scala特性與Java 8接口之間有什麼區別和相似之處?

的Java 8中添加一些能夠有地方可以提供一種實現默認的方法接口。

什麼是Java 8接口和Scala性狀之間的異同?

+4

檢查出的網站,它可以幫助你http://www.infoq.com/articles/java-8-vs-scala – CRazyProgrammer 2013-05-07 03:20:37

+3

TL;博士:**虛擬擴展方法[默認的方法]的主要動力是API進化。一個可喜的副作用是它們提供了一種多重繼承的形式,這種形式僅限於行爲。 Scala中的特徵不僅提供了多重行爲繼承,而且還提供了狀態的多重繼承。除了狀態和行爲繼承之外,特徵提供了一種獲取對實現類的引用的方法... [Scala]特徵比[Java 8]的虛擬擴展方法提供了更豐富的特徵集。** – 2014-12-21 15:46:57

回答

32

的動機Java 8的默認方法斯卡拉特徵不同。

前者推出了支持安全的API進化和多重繼承的形式有限。隨着Lambda項目利用函數式編程成語它是有益的補充,例如forEach(lambda)方法java.util.Collection接口不改變所有可能的實施者(這實際上是不可能在不破壞向後兼容性做的)。作爲副作用,這也提供了一種形式mixin composition

斯卡拉特徵是從零開始設計的模塊化組件構建模塊。他們是多重繼承友好的,沒有diamond problem由於線性化對混合的評估順序有嚴格的規則。他們也支持國家,可以參考實施課程,並對哪些類型可以混入其中進行限制。查看斯卡拉收藏庫,其中特徵被徹底使用。

9

注意與scala 2.12.0 RC1 (Sept. 2016)Trait現在編譯成一個接口。
斯卡拉2.12是所有關於Java的8的新功能最佳使用

與Java 8允許接口的具體方法,斯卡拉2.12能夠編譯性狀一個接口。

之前,一個特徵被表示爲一個擁有方法實現的類和一個接口
請注意,編譯器在幕後執行仍然有相當多的魔力,因此如果要用Java實現特徵,必須小心。 (簡而言之,如果特質執行下列任何操作,則其子類需要合成代碼:定義字段,在主體中調用超級初始化語句,擴展類,依賴線性化來查找右邊超級特徵中的實現。)

查看scala PR 5003更多不同的實現。

相關問題