Scala - 默认值为无地图?

时间:2015-05-01 17:11:33

标签: scala dictionary return-value options

鉴于

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]

我正在尝试做什么的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

NoneOption[Nothing]的一个实例。但Option在其类型参数中是协变的,Nothing是所有内容的子类型。

这意味着NoneOption[A]的子类型。只是这样说:

None: Option[A]

但是类型推断通常可以为你做。如果您事先创建了该功能,

val default = (c: C) => None

然后您将获得错误的返回类型并需要指定它,但withDefaultValue应该已经知道您的地图类型。