List中的伴随方法

时间:2016-12-05 16:57:39

标签: scala

我注意到List类中有一个名为'companion'的方法。它有什么作用?它的定义是'构建类List实例的工厂伴侣对象。

似乎我可以使用l.companion(11,12,13)方法创建List的新实例,但为什么我这样做而不是使用List(11,12,13)?

val l = List[Int](1,2,3,4,1)
l: List[Int] = List(1, 2, 3, 4, 1)

val l2 = l.companion
l2: scala.collection.generic.GenericCompanion[List] = scala.collection.immutable.List$@6c3e1f48

//I can create new instances of a List using l2 but why would I do it this way?
val l3 = l2(100,11,123)

l3.foreach(println _)
100
11
123
res0: Unit = ()

从companion返回的对象也可用于创建可变集合(Builders)。但是我为什么要用这种方式创建收藏品呢?

//create a Builder (a mutable collection) whose elements would be list of strings
val l5 = l2.newBuilder[List[String]]
l5: scala.collection.mutable.Builder[List[String],List[List[String]]] = ListBuffer()

l5+=List("h")
l5+=List("2")

println(l5)
ListBuffer(List(h), List(2))
res3: Unit = ()

1 个答案:

答案 0 :(得分:1)

在正常情况下,它并不适合您使用。集合类的许多伴随对象都继承自GenericCompanion。从中继承的任何内容都必须实现newBuilder,它为关联的集合类型提供Builder。反过来,该集合的伴随对象继承了applyempty方法,这些方法几乎在标准集合库中的任何位置都使用。

每个List(以及许多其他集合)引用它自己的同伴的(可能)原因是它可以用于泛型,特别是对于更高种类。

没有本机方法可以单独使用类型系统将类型与其随播广告相关联。例如,如果你想要一些M[A] <: Traversable[A],你就无法找到它的伴侣(一般来说,像这样的通用类型甚至可能没有)。要解决这个问题,我们要求集合本身引用它自己的伴侣(强加其他类型参数和约束)。它还节省了在所有集合中复制applyempty的多个实现的需要。