gpt4 book ai didi

scala - Scala 如何知道使用什么集合实现?

转载 作者:行者123 更新时间:2023-12-03 20:35:44 25 4
gpt4 key购买 nike

val set1 = Set(1,2,3)

或者
val list1 = List(1,2,3)

你能描述一下这些物体构造背后的精确机制吗?

java 我们需要 HashSet 或 LinkedList 来构造对象。

在这里,我们看到了与 apply 方法一起使用的特征?

这个应用方法在哪里?

有暗示的东西?

最佳答案

特征可以有伴随对象。所以当你调用Set(1, 2, 3) ,您实际上是在调用 apply伴随对象上的方法 Set .例如,您可以看到 Set伴随对象文档 here ,及其源代码here .

每个集合类型的伴生对象都有一个默认实现,使用 apply 实例化。 .事实上,集合类型的伴生对象都是从抽象类 GenericCompanion 扩展而来的。 ,它封装了这种行为。

这是 Scala 不可变集合类型层次结构的图像。来自 A 的箭头至B表示 B扩展 A , 虚线箭头表示 B隐式可见为 A , 粗线表示 apply A 的伴随对象上的方法返回 B 的实例.

Scala immutable collections

因此,例如,当您调用 Iterable(1, 2, 3) , 你得到一个 List , 因为 Iterable 中有粗线至SeqLinearSeqList .你可以阅读更多关于 Scala 集合类型层次结构(包括可变版本)here .

当来自 Java 时,这可能会令人惊讶,但它实际上很有意义。当您实例化 Set ,例如,您可能不关心实际的实现是什么,实际上只想要 Set 的所有保证。类型契约(Contract),并且可以信任语言来选择实现。

你碰巧用了Set在您的问题中,这稍微复杂一些。 Sets少于 5 个元素的元素有特殊的实现以提高效率。所以上图中的粗体箭头只显示了通常的情况(对于足够大的 Sets )。例如:

Set(1, 2, 3, 4, 5).asInstanceOf[HashSet[Int]] // Works as expected
Set(1, 2, 3).asInstanceOf[HashSet[Int]] // Doesn't work!
Set(1, 2, 3).asInstanceOf[collection.immutable.Set.Set3[Int]] // Set3 is the special implementation of sets with example 3 elements.

作为使用集合的最后一点,在此处使用 REPL 对于确定集合特征的默认实现非常有用(无需引用图表)。例如,在这里我们可以看到 Iterable伴随对象构造一个 List ,正如预期的那样:
Iterable(1, 2, 3)
>>> Iterable[Int] = List(1, 2, 3)

关于scala - Scala 如何知道使用什么集合实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29605599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com