【发布时间】:2014-12-11 19:36:41
【问题描述】:
我发现自己经常做这样的模式匹配
val foo: Foo = ...
foo match {
case bar: Bar => Some(bar)
case _ => None
}
我想让这个更短。
val foo: Foo = ...
optInstance[Foo, Bar](foo)
可能性 1 - 直接翻译
def optInstance[A, B <: A](a: A) = a match {
case b: B => Some(b)
case _ => None
}
// warning: abstract type pattern B is unchecked since it is eliminated by erasure
可能性 2 - try-catch
def optInstance[A, B <: A](a: A) =
try {
Some(a.asInstanceOf[B])
} catch {
case e: ClassCastException => None
}
// no warnings
可能性 3 - if-else
def optInstance[A, B <: A](a: A) =
if(a.isInstanceOf[B]) {
Some(a.asInstanceOf[B])
} else {
None
}
// no warnings
它们都不起作用。 (斯卡拉 2.11.2)
有没有通用的写法
foo match {
case bar: Bar => Some(bar)
case _ => None
}
(如果没有,至少有更短的方法吗?)
【问题讨论】:
-
当 foo 不是 Bar 时,它是什么?