【发布时间】:2021-09-10 05:42:47
【问题描述】:
鉴于此代码
class Animal{}
class Dog extends Animal{}
class Cat extends Animal{}
class Pitbull extends Dog{}
object MyClass {
def main(args: Array[String]) {
val animals: List[Animal] = List(new Dog(), new Cat(), new Pitbull(), new Dog(), new Cat())
getElementOftype(animals, PitBull)
}
def getElementOftype(list: List[Animal], givenType: ???): Animal = {
}
}
我想从这个 List 中提取 Pitbull 类型的第一个元素,我应该如何处理?
我试过但感觉不对
trait Identity{
def who: String
}
class Animal extends Identity{
override def who = "Animal"
}
class Dog extends Animal with Identity{
override def who = "Dog"
}
class Cat extends Animal with Identity{
override def who = "Cat"
}
class Pitbull extends Dog with Identity{
override def who = "Pitbull"
}
object MyClass {
def main(args: Array[String]) {
val animals: List[Animal] = List(new Dog(), new Cat(), new Pitbull(), new Dog(), new Cat())
println(getElementOftype(animals, new Pitbull()))
}
def getElementOftype(list: List[Animal], givenType: Animal): Option[Animal] = {
list.collectFirst{case s if s.who == givenType.who => s}
}
}
我想简单地将Pitbull 作为参数传递,而不是实例化一个空对象。
这个方法可行,但我认为这不是最好的方法。 必须有一种更大规模的方式来做到这一点。
【问题讨论】:
-
你尝试了什么,什么不起作用?
-
@GaëlJ 我添加了我用作解决方法的代码。
-
一般来说,您应该避免出现这种情况。当绝对必要时
ClassTag在类型擦除没有问题的情况下工作,否则您可能需要更高级的东西,例如 Shapeless 或TypeTag或您自己的 typeclass.