具有抽象类类型和访问子级的Scala列表

时间:2013-12-21 00:51:07

标签: scala types

我创建了一个抽象类和两个真正的类

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?

2 个答案:

答案 0 :(得分:2)

你是PartialFunction aproach:

myList.foreach{
  case x:Block => x.block_method
  case _ =>
}

答案 1 :(得分:2)

与wheaties的回答类似,您可以将collectPartialFunction一起使用,以获取仅包含部分函数适用的元素的集合:

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