如果我传递底层类型,为什么期望类型别名输入的函数不进行类型检查?



在下面的代码中,当传递给函数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)

最新更新