Scala - 使用默认值 None 映射?

Scala - Map with default value None?

给定

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 期望 None 从 catch 子句返回,所以我尝试了非常难看的

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]

做我想做的事情的正确方法是什么?

NoneOption[Nothing] 的实例。但是 Option 在其类型参数上是协变的,而 Nothing 是一切的子类型。

这意味着 NoneOption[A] 的子类型。就这么说吧:

None: Option[A]

但类型推断通常可以为您完成。如果你提前创建函数,

val default = (c: C) => None

那么你会得到错误的 return 类型并需要指定它,但是 withDefaultValue 应该已经知道你的地图的类型。