Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.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_Type Erasure - Fatal编程技术网

处理Scala列表中的类型擦除

处理Scala列表中的类型擦除,scala,type-erasure,Scala,Type Erasure,我有一些课程,比如 sealed trait Animal case class Bird(name:String, birdField: BirdType) extends Animal case class Cat(name:String, catField: CatType) extends Animal 然后是一个像 case class AnimalWrapper(id:Int, animal:Animal) 和 例如,从AnimalWrapper提取Cat的最佳方法是什么,以及执

我有一些课程,比如

sealed trait Animal
case class Bird(name:String, birdField: BirdType) extends Animal
case class Cat(name:String, catField: CatType) extends Animal
然后是一个像

case class AnimalWrapper(id:Int, animal:Animal)

例如,从
AnimalWrapper
提取
Cat
的最佳方法是什么,以及执行映射以访问其
catField

差不多

animalWrapper.getThisAnimal[Cat](byName).map(_.catField)

我可以使用
ClassTag
从列表中获取任何动物,比如
getThisAnimal[T你不需要施法,这就是模式匹配的目的:

case类AnimalWrapper(id:Int,animal:animal){
def getthis animal[T Some(T)
案例=>无
}
}
}

我找到了解决方案。你必须把
动物包装器
做成一个通用的,就像
动物包装器一样[T因为集合中有两种不同的类型,所以需要对动物类型进行模式匹配。如果要避免ClassCastException,结果是什么?原始列表中包含所有猫的列表?列表的第一个猫?确保所有元素都是猫?执行
映射
,根据该映射选择要执行的操作如果每个元素是猫还是鸟?一个
选项[AnimalWrapper]
,我可以在其上执行
birdField
catField
,而无需任何施法,如
getThisAnimal[Cat].map(u.animal.catField)
问题在于
AnimalWrapper
会丢失所有类型信息,因此,即使您确定包装中包含的是一只鸟,编译器也不会接受它,除非您执行脏强制转换。-也许我们可以修改包装类?或者您根本不需要返回包装类,只需返回动物的元组d id?-另外,您提到了一个选项,所以我想您希望列表中的第一个匹配项(如果有)?它似乎重复了
ct。不适当地
:问题不在于获取类,而在于访问它的字段。因为从
列表[Animalwrapper]返回的内容
-我希望如此-是一个
动物包装器
,它不知道
动物
type@user2963757我不明白你期望的是什么,也许你可以提供更多细节,或者丰富你在原始问题中提供的代码示例。给我们输入和预期输出。选项[AnimalWrapper],在此基础上,我可以不使用任何强制转换来执行birdField或catField,例如getThisAnimal[Cat].map(uu.animal.catField)。使用typeclass可能比依赖类检查更好。
animalWrapper.getThisAnimal[Cat](byName).map(_.catField)