Scala中的参数化类型检查
我希望能够在Scala中断言参数化列表的类型。例如,我有以下类型:Scala中的参数化类型检查,scala,Scala,我希望能够在Scala中断言参数化列表的类型。例如,我有以下类型: class Animal class Cat extends Animal class Dog extends Animal 我将列表实例化如下: val l1 = List(new Cat()) val l2 = List(new Dog()) val m = l1 ::: l2 当我尝试使用scalatest匹配器断言listm的类型时,我只能断言泛型类型,而不能断言参数化类型 import org.scalatest.
class Animal
class Cat extends Animal
class Dog extends Animal
我将列表实例化如下:
val l1 = List(new Cat())
val l2 = List(new Dog())
val m = l1 ::: l2
当我尝试使用scalatest
匹配器断言listm
的类型时,我只能断言泛型类型,而不能断言参数化类型
import org.scalatest.Matchers._
m shouldBe a [List[_]]
我实际上想做的是断言m
是List[Animal]
类型,而不是List[Cat]
或List[Dog]
有什么方法可以这样做吗?由于类型擦除,您不能在运行时断言实际的类型参数。即使您使用类似于
new MyList[Cat]{/**在匿名类定义中保存实际的类型参数*/}
的方法来避免类型擦除,也没有什么意义,因为List[Cat]
实际上是一个List[Animal]
在Scala中。由于类型擦除,您无法在运行时断言实际的类型参数。即使您使用类似于new MyList[Cat]{/**在匿名类定义中保存实际的类型参数*/}
的方法来避免类型擦除,也没有什么意义,因为List[Cat]
实际上是一个List[Animal]
在Scala中。类型擦除将阻止您在运行时检查类型参数。这是因为任何List[T]
在运行时都会变成List[any]
(T
的实际值被“擦除”)
但是,正如其他人所指出的,不需要编写单元测试,因为编译器将自动推断m
的类型为List[Animal]
。这是因为列表
被声明为协变的(在列表[+T]
定义中的+
)
有关协方差的详细信息,请参阅。类型擦除将阻止您在运行时检查类型参数。这是因为任何
List[T]
在运行时都会变成List[any]
(T
的实际值被“擦除”)
但是,正如其他人所指出的,不需要编写单元测试,因为编译器将自动推断m
的类型为List[Animal]
。这是因为列表
被声明为协变的(在列表[+T]
定义中的+
)
有关协方差的更多详细信息,请参阅。编译器是否已经为您证明了这一点?或者您是否有
列表[Any]
?scalatest.Matchers
似乎是运行时的,因此它无法验证通过类型擦除擦除的类型。编译器是否已经为您证明了这一点?或者您是否有列表[任何]
?scalatest.Matchers
似乎是运行时的,因此它无法验证通过类型擦除擦除的类型。