2
我有一个类型层次结构,并希望为实现请求查找方法。我在遇到问题时无需使用asInstanceOf
电话。在Scala中用TypeTag对类型层次结构进行模式匹配的习惯用法是什么?
所以给人一种简单的类型层次结构,像这样
trait Vehicle
trait Flying extends Vehicle
class Plane extends Flying
trait Driving extends Vehicle
class Car extends Driving
trait Swimming extends Vehicle
class Boat extends Swimming
我的查找方法是这样的
def findVehicle[V <: Vehicle](implicit tag: TypeTag[V]): Option[V] = {
val v = tag.tpe match {
case t if t =:= typeOf[Flying] => Some(new Plane)
case t if t =:= typeOf[Driving] => Some(new Car)
case t if t =:= typeOf[Swimming] => Some(new Boat)
case _ => None
}
v.map(_.asInstanceOf[V])
}
,象这样
println(findVehicle[Flying]) // Some([email protected])
查找是否有可能实现像这样的查找没有asInstanceOf
在最后?
这看起来很有希望,但是如何处理'case _ => None'情况? – 2014-10-16 16:39:43
为了使上面的注释更加清楚:如果'flyingBuilder'没有被定义,我们得到一个编译错误,而不是'findVehicle'的'None'结果 – 2014-10-16 17:43:04
我更新了我的答案。既然'Builder'是协变的,你可以简单地用'build'来返回一个'Option [T]'并且在范围内有一个'Builder [Nothing]。 – 2014-10-16 19:30:35