【发布时间】:2015-07-11 07:12:56
【问题描述】:
假设我有
trait A
case class S(s:String) extends A
case class B(b:Boolean) extends A
和
val m = scala.collection.mutable.HashMap[String,(Seq[C]) => Option[A]](
"testS" -> ((cs:Seq[C]) => Some(S(foo(cs)))),
"testB" -> ((cs:Seq[C]) => Some(B(bar(cs)))),
...
)
现在假设我们有一个类型 D 这样D <: C:
val m = scala.collection.mutable.HashMap[String,(Seq[C]) => Option[A]](
"testS" -> ((cs:Seq[C]) => Some(S(foo(cs)))),
"testB" -> ((cs:Seq[C]) => Some(B(bar(cs)))),
"testD" -> ((ds:Seq[D]) => Some(B(baz(ds.head)))), //oops!
...
)
是的,像我一样愚蠢,我(再次)忘记了参数应该是逆变的,意思是
D <: C, therefore (C => E) <: (D => E)
所以当然 Scala 不会让我这样做:“类型不匹配”
使用地图的整个想法是客户端应该能够添加他自己的映射。当然,我可以简单地要求像
这样添加此类案例 "testD" -> ((ds:Seq[C]) => Some(B(baz(ds.head.asInstanceOf[D]))))
但这是唯一的解决方案吗?
【问题讨论】:
标签: scala dictionary covariance contravariance