我创建了一个抽象类和两个真正的类
abstract class ProcElems {
def invoke()
}
class Brick(title: String) extends ProcElems {
def invoke {
println("invoked brick")
}
}
class Block(title:String) extends ProcElems {
def block_method = println("1")
override def invoke {
println("invoked block")
}
}
现在我用Abstract类定义List 并添加一些像砖块和块类型的对象
val l: List[ProcElems] = List(Title: block, Title: brick, Title: block)
当我尝试在第一个元素上调用block_method时它会给我错误,因为ProcElems没有这个方法。但是当我做的时候
l.head.getClass #/ gives the real(non abstract) class Block
问题:如何使用抽象类类型调用list_method?
答案 0 :(得分:2)
你是PartialFunction
aproach:
myList.foreach{
case x:Block => x.block_method
case _ =>
}
答案 1 :(得分:2)
与wheaties的回答类似,您可以将collect
与PartialFunction
一起使用,以获取仅包含部分函数适用的元素的集合:
scala> val l: List[ProcElems] = List(new Brick("brick"), new Block("block1"), new Block("block2"))
scala> val blocks = l.collect { case block: Block => block }
blocks: List[Block] = List(Block@d14a362, Block@45f27da3)
现在您可以根据需要使用List[Block]
:
scala> blocks.head.block_method
1
scala> blocks.foreach(_.block_method)
1
1