【发布时间】:2021-05-17 07:35:29
【问题描述】:
我有一些类似的课程
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)
还有一个
List[AnimalWrapper]
例如,从AnimalWrapper 中提取Cat 并进行映射以访问其catField 的最佳方法是什么?
类似
animalWrapper.getThisAnimal[Cat](byName).map(_.catField)
我使用ClassTag 来获取列表中的任何动物,例如getThisAnimal[T <:Animal <:ClassTag]: Option[T],但是如果之前没有丑陋的演员表,我无法进行映射,这真的是不可接受的。
我还没有找到有什么有用的,或者至少是一个体面的解决方法,所以有什么想法吗?
谢谢
【问题讨论】:
-
因为您的集合中有两种不同的类型,您需要对 Animal 类型进行模式匹配。如果你想避免 ClassCastException
-
你想要的结果是什么?一个 List 与原始 List 中的所有 Cats? List 的第一个 Cat?确保所有元素都是Cats?执行
map,根据每个元素是 Cat 还是 Bird 来选择要执行的操作? -
一个
Option[AnimalWrapper],我可以在它上面做birdField或catField而不需要任何演员,比如getThisAnimal[Cat].map(_.animal.catField) -
问题是
AnimalWrapper丢失了所有类型信息,所以即使您确定包装器中的内容是 Bird 编译器也不会接受它,除非你做了一个肮脏的演员。 - 也许我们可以修改包装类?或者,也许您根本不需要返回包装类,只需要返回动物和 id 的元组? - 另外,你提到了一个 Option 所以我猜你想要 List 中的第一个匹配(如果有的话)?
标签: scala type-erasure