Scala中的参数化类型检查

时间:2019-03-18 21:49:38

标签: scala

我希望能够在Scala中声明参数化List的类型。例如我有以下几种类型:

class Animal
class Cat extends Animal
class Dog extends Animal

我实例化列表如下:

val l1 = List(new Cat())
val l2 = List(new Dog())
val m = l1 ::: l2

当我尝试使用m匹配器声明列表scalatest的类型时,我只能声明通用类型,而不能声明参数化类型。

import org.scalatest.Matchers._

m shouldBe a [List[_]]

我实际上想要做的是断言m的类型为List[Animal],而 NOT 的类型为List[Cat]List[Dog]

有什么办法可以做到吗?

2 个答案:

答案 0 :(得分:4)

由于类型擦除,您无法在运行时声明实际的类型参数。即使您使用new MyList[Cat]{/** saves the actual type parameter in anonymous class definition */}之类的方法来规避类型擦除,也没有任何意义,因为List[Cat] IS 实际上是Scala中的List[Animal]

答案 1 :(得分:3)

类型擦除将阻止您在运行时检查type参数。这是因为任何List[T]在运行时都会变成List[Any]T的实际值被“擦除”)。

但是,正如其他人指出的那样,您不需要编写单元测试,因为编译器会自动将m的类型推断为List[Animal]。这是因为List被声明为协变量+定义中的List[+T])。

有关协方差的更多详细信息,请参见this answer