在下面的代码中,当传递给函数imSeq时,为什么编译器不能推断出x1是不可变的?
def imSeq(e: scala.collection.immutable.Seq[Int]) = e.foreach(println)
def mSeq(e: Seq[Int]) = e.foreach(println)
scala> val x1 = Seq(1, 2, 3)
x1: Seq[Int] = List(1, 2, 3)
scala> x1.isInstanceOf[scala.collection.immutable.List[Int]]
res11: Boolean = true
scala> x1.isInstanceOf[scala.collection.immutable.Seq[Int]]
res12: Boolean = true
scala> x1.isInstanceOf[scala.collection.mutable.Seq[Int]]
res13: Boolean = false
scala> imSeq(x1)
<console>:10: error: type mismatch;
found : Seq[Int]
required: scala.collection.immutable.Seq[Int]
imSeq(x1)
^
这是因为您显式地在函数中需要immutable.Seq
的实例,但是预导入的Seq
特征不仅仅是immutable.Seq
的别名,它实际上是immutable.Seq
的基本特征。也就是说,immutable.Seq
扩展了Seq
。
泛化可接受的类型:
def imSeq(e: Seq[Int]) = e.foreach(println)