我希望能够在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]
>
有什么办法可以做到吗?
答案 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。