scala - 从超类列表中提取给定子类的元素
问题描述
鉴于此代码
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
作为参数传递,而不是实例化一个空对象。
这个可行,但我认为这不是最好的方法。必须有一种更大规模的方式来做到这一点。
解决方案
你可以这样做(未经测试,可能有一些错别字):
def getElementOftype[A <: Animal](list: List[Animal])(implicit ct: ClassTag[A]): Option[A] = {
list.collectFirst { case s: A => s }
}
ClassTag
必须能够匹配 中的A
类型collectFirst
。
推荐阅读
- r - R中数据框中列的字典样式替换
- python - 如何让 Scons 中的 SConscript 知道标头位置?
- kubernetes - 在 kubernetes 集群中运行的 thrift hiveservers 的反向代理
- ruby-on-rails - 如何避免 Rails 依赖破坏中的 N+1 查询?
- matlab - Matlab循环中的置换
- python - 在 SQLAlchemy 中,有没有一种方法可以象征性地创建一个真正创建两列的列?
- android - 知道何时以编程方式删除了应用程序
- python - 将二维数组作为元素传递给 sklearn.SVM
- ios - 未找到符号:_XRContextFromDetailNode
- angular - 仅禁用选中的复选框Angular 8