我真的不明白这个小东西。我有一个抽象类 Box,其中包含不同类型的几个子类。例如
abstract class Box
class StringBox(val sValue : String) extends Box
Box 的伴生对象中的 apply 方法很简单:
object Box{
def apply(s: String) = new StringBox(s)
def apply(b: Boolean) = new BooleanBox(b)
def apply(d: Double) = new DoubleBox(d)
}
所以我可以写
val sb = Box("StringBox)
好吧,写 unapply 会有些麻烦。我的第一个想法是对类型使用模式匹配,如下所示:
def unapply(b: Box) = b match {
case sb: StringBox => Some(sb.sValue)
case bb: BooleanBox => Some(bb.bValue)
case db: DoubleBox => Some(db.dValue)
case _ => None
}
由于类型擦除,这根本不起作用。
第二次尝试是具有类型 T 的通用 Box[T] 和在每个子类中重新定义的抽象类型成员。例如:
abstract class Box[T] {def value : T}
class StringBox(val sValue : String) extends Box[String] {
override def value : String = sValue
}
因此,我可以将我的 unapply 重新编写为:
def unapply[T](b: Box[T]) = b match {
case sb: Box[String] => Some(sb.value)
case bb: Box[Boolean] => Some(bb.value)
case db: Box[Double] => Some(db.value)
case _ => None
不幸的是,这也不起作用。所以我猜 Box[String] 中的显式类型引用也会被删除,所以我需要使用类型清单。也许是这样的:
def unapply[T](b: Box[_])(implicit target: Manifest[T]): Option[T] = {
if(b.value == target) Some(b.value.asInstanceOf[T])
else None
}
此代码编译(2.10),但仍然没有所需的隐式转换。为什么?
简单的问题,有没有办法在不使用反射或清单的情况下进行值提取?
真正让我感到困惑的是,是否有一种简单的(r)方法可以结合多态性和模式匹配?如果没有,Scala 中是否有其他方法可以实现类似的效果?
有什么想法或建议吗?
非常感谢你。