给定
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]
做我想做的正确方法是什么?
None
是的实例Option[Nothing]
。但是Option
其类型参数是协变的,并且Nothing
是所有内容的子类型。
这表示None
是的子类型Option[A]
。只是这样说:
None: Option[A]
但是类型推断通常可以为您完成。如果您提前创建函数,
val default = (c: C) => None
那么您将得到错误的返回类型并需要指定返回类型,但withDefaultValue
应该已经知道地图的类型。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句