List :::运算符和++之间的区别

Luk*_*don 23 scala list operators

scala :::++operator 之间有什么区别?根据文件,行为是一样的.

Kim*_*bel 35

他们做同样的事情,不同之处在于++可以与任何使用Traversable并且:::只能用列表来使用.此外,:在右边的对象上调用以end结尾的方法,因此:::参数是前缀,而++参数是后缀.


Bri*_*ian 14

行为是一样的.不同之处在于他们接受的类型.

:::只接受一个List.++接受是一系列类型的[B >: A, That]意义,它们++将接受一个类型,其下限为List上限,并且中间有GenTraversableOnce[B]类型.

因此,在类型层次结构图中,扩展trait GenTraversableOnce并且是超类型的类List是有效的

列表类型层次结构

示例使用List和LinkedList显示此行为:

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

scala> val l2 = List(4,5,6)
l2: List[Int] = List(4, 5, 6)

scala> l ++ l2
res0: List[Int] = List(1, 2, 3, 4, 5, 6)

scala> l ::: l2
res1: List[Int] = List(1, 2, 3, 4, 5, 6)

scala> import scala.collection.mutable.LinkedList
import scala.collection.mutable.LinkedList

scala> val ll = LinkedList(1,2,3)
ll: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2, 3)

scala> ll ++ l2
res2: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2, 3, 4, 5, 6)

scala> ll ::: l2
<console>:11: error: type mismatch;
found   : scala.collection.mutable.LinkedList[Int]
required: List[?]
          ll ::: l2
Run Code Online (Sandbox Code Playgroud)

另外,请参阅Kim关于关联性的说明.