2016-08-31 12 views
0

有許多繼承特質Set的類。 HashSet,TreeSet等爲什麼class Set在scala中不存在?

還有對象(我可以稱它爲伴侶對象的特徵集?不是在類集的情況下?)集和特徵集。

在我看來,僅僅在該列表中添加一個「Set」類使得它似乎很容易理解結構。

是否有任何原因類集不應該存在?

+0

我沒有看到你缺少的東西。你會用什麼課程?你會把它放在「結構」中? – Bergi

+0

我認爲Object Set.apply的結果類型不明確。 對象的結果Set.apply具有類型Trait Set,並且Scala解釋器說它具有類型Trait Set,但是它真的有什麼類? 我知道斯卡拉特質與java界面完全不一樣,但我不認爲特質本身可以是一個類,但我錯了嗎? – user3293793

+0

特徵類似於Java接口......它只是它們更通用。 –

回答

1

在斯卡拉,類和特徵之間沒有重疊。類是可實例化的實現,而特徵是可獨立混合的接口。 Set.apply的使用給了一個帶有接口Set的對象,這就是你需要知道的一個使用它的對象。我完全理解想要一個具體的類型,但這是沒有必要的。這裏要做的正確的事情是將它保存到Set類型的v​​al中,並只使用Set提供的接口。

我知道這可能不是令人滿意的,但是給它一點時間,Scala類型系統就其本身而言是有意義的,即使這與Java所做的不同。

3

如果你只需要一套,請詢問Set.apply一個集合,你已經完成並且很開心,你有一套支持應該支持的操作集合的有效集合,不用擔心它是如何實現的。它已準備好適用於大多數使用情況。另一方面,如果某些操作的執行對你很重要,那麼創建一個具體實現set的具體類,並且你將確切地知道你擁有了什麼。

在java中你可以這樣寫:

Set<String> strings = new HashSet<>(Arrays.asList("a", "b")); 

在Scala中,你可以也有那些類型

val strings: Set[String] = HashSet("a", "b") 

,但你也可以使用一個方便的工廠,如果你並不需要擔心類型和簡單使用

val strings = Set("a", "b") 

並沒有什麼是錯的,我不知道如何添加另一個類會有所幫助。具有接口/特性和具體實現是很正常的事情,中間不需要任何東西,也不需要幫助。

Set.apply是集工廠。您可以使用getClass來檢查生成對象的實際類別。這個工廠創建特殊,優化集大小0-4,例如

scala.collection.immutable.Set$EmptySet$ 
scala.collection.immutable.Set$Set1 
scala.collection.immutable.Set$Set2 

更大的套它是一個哈希集合,即scala.collection.immutable.HashSet$HashTrieSet

相關問題