处理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)