首页 > 解决方案 > 从超类列表中提取给定子类的元素

问题描述

鉴于此代码

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 = {
        
    }
}

我想从这个列表中提取 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作为参数传递,而不是实例化一个空对象。

这个可行,但我认为这不是最好的方法。必须有一种更大规模的方式来做到这一点。

标签: scalascala-collections

解决方案


你可以这样做(未经测试,可能有一些错别字):

def getElementOftype[A <: Animal](list: List[Animal])(implicit ct: ClassTag[A]): Option[A] = {
  list.collectFirst { case s: A => s }
}

ClassTag必须能够匹配 中的A类型collectFirst


推荐阅读