Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala中的参数化类型检查_Scala - Fatal编程技术网

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.

我希望能够在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
匹配器断言list
m
的类型时,我只能断言泛型类型,而不能断言参数化类型

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
似乎是运行时的,因此它无法验证通过类型擦除擦除的类型。