为什么scala中不存在类Set?

时间:2016-08-31 02:40:02

标签: scala collections

有许多类继承了特征集。 HashSet,TreeSet等

还有那个对象(我可以将它称为特征集的伴随对象吗?不是在类Set的情况下?)Set和trait Set。

在我看来,只需再添加一个类" Set"在这个列表中,似乎很容易理解结构。

是否有任何原因不应该存在类集?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

在Scala中,类和特征之间没有重叠。类是可以实例化的实现,而特征是可独立混合的接口。 Set.apply的使用为对象提供了接口Set,这是您使用它所需要知道的全部内容。我完全理解想要一个具体的类型,但这是不必要的。这里正确的做法是将它保存到Set类型的v​​al中,并仅使用Set提供的接口。

我知道这可能并不令人满意,但是给它时间,Scala类型系统本身就有意义,即使它与Java不同。