【问题标题】:why class Set does not exists in scala?为什么scala中不存在类Set?
【发布时间】:2016-08-31 02:40:01
【问题描述】:

有很多类继承了 trait Set。 HashSet、TreeSet等

还有 Object(我可以称它为 trait Set 的伴生对象吗?不是在类 Set 的情况下?) Set 和 trait Set。

在我看来,只要在这个列表中再添加一个类“Set”就可以很容易理解结构。

有什么理由不应该存在类集吗?

【问题讨论】:

  • 我看不出你缺少什么。你会用这个类做什么?你会把它放在“结构”的什么地方?
  • 我认为 Object Set.apply 的结果类型不明确。对象 Set.apply 的结果具有 Trait Set 类型,scala 解释器说它具有 Trait Set 类型,但是它真正具有什么类?我知道 scala Trait 与 java Interface 完全不同,但我不认为 trait 本身可以是一个类,我错了吗?
  • Traits 类似于 Java 接口......只是它们更通用。

标签: scala collections


【解决方案1】:

如果您只需要一个集合,请使用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

【讨论】:

    【解决方案2】:

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

    我知道这可能并不令人满意,但给它时间,Scala 类型系统就其自身而言将是有意义的,即使这与 Java 所做的不同。

    【讨论】:

      猜你喜欢
      • 2012-09-14
      • 1970-01-01
      • 2017-02-22
      • 1970-01-01
      • 2013-03-27
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 2015-02-10
      相关资源
      最近更新 更多