鉴于
trait A
case class B extends A
trait C
我试图实现类似于此的东西:
val m = scala.collection.mutable.HashMap[String, C=>Option[A]](
... //some pre-defined mappings
).withDefaultValue((_:C) => None)
这会给我一个类型不匹配:
expected: C=>Option[A], actual: C=>None.type
我听说scala期望从catch子句中返回None,所以我尝试了非常丑陋的
val m = scala.collection.mutable.HashMap[String, C=>Option[A]](
... //some pre-defined mappings
).withDefaultValue((_:C) => try {
throw new RuntimeException()
Some(B())
} catch{ case _ => None}
)
但是(谢天谢地)也没有工作:
type mismatch, expected: C=>Option[A], actual: C=>Option[B]
我正在尝试做什么的正确方法是什么?
答案 0 :(得分:3)
None
是Option[Nothing]
的一个实例。但Option
在其类型参数中是协变的,Nothing
是所有内容的子类型。
这意味着None
是Option[A]
的子类型。只是这样说:
None: Option[A]
但是类型推断通常可以为你做。如果您事先创建了该功能,
val default = (c: C) => None
然后您将获得错误的返回类型并需要指定它,但withDefaultValue
应该已经知道您的地图类型。