jol*_*ier 2 scala covariance scala-collections
在我的用例中,我有一个具有协变类型Foo [+ T]的类和类A <:T,B <:T,C <:T,我需要存储一个地图"A" - >一个Foo [A]实例,"B" - >一个Foo [B]实例和"C" - >一个Foo [C]实例,这在scala中可能吗?
目前我将我的地图声明为Map [String,Foo [T]]]但是我不能在里面添加一个Foo [A],编译器告诉我Foo [T]是预期的,而不是Foo [A ],这似乎是由Map参数缺乏协方差引起的,是否有解决方案?
我现在的解决方法是取消参数化Foo并在代码中进行转换,这当然不讨好我,我也看到我可以使用java集合但我更喜欢使用scala.
在此先感谢您的时间
适用于我,即使使用非协变可变映射.
Welcome to Scala version 2.9.1.RC1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).
scala> class T
defined class T
scala> class A extends T
defined class A
scala> class Foo[+T]
defined class Foo
scala> val m = collection.mutable.Map[Int, Foo[T]]()
m: scala.collection.mutable.Map[Int,Foo[T]] = Map()
scala> val m2 = m + (1 -> new Foo[A])
m2: scala.collection.mutable.Map[Int,Foo[T]] = Map(1 -> Foo@48f2818d)
scala> m += (2 -> new Foo[A])
res0: m.type = Map(2 -> Foo@12caa79c)
Run Code Online (Sandbox Code Playgroud)
如果Foo[T]不是协变的T,则最后一个命令(m += (2 -> new Foo[A]))将失败.
请注意,此代码有效,因为元组在其类型中也是协变的.
| 归档时间: |
|
| 查看次数: |
1279 次 |
| 最近记录: |