Map <string,list <?=“”extends =“”t =“”>&gt;在Scala中</string,>

时间:2011-08-04 21:53:14

标签: scala covariance scala-collections

在我的用例中,我有一个具有协变类型Foo [+ T]的类和类A&lt;:T,B&lt;:T,C&lt;:T, 我需要存储地图“A” - &gt; Foo [A]实例,“B” - &gt; foo [B]实例和“C” - &gt;一个Foo [C]实例,这在scala中可能吗?

目前我将我的地图声明为Map [String,Foo [T]]],但后来我无法在内部添加Foo [A],编译器告诉我Foo [T]是预期的,而不是Foo [A],似乎是由Map参数缺乏协方差引起的,是否有解决方案?

我现在的解决方法是取消参数化Foo并在代码中进行转换,这当然不会让我满意,我也看到我可以使用java集合但我更喜欢使用scala。

提前感谢您的时间

2 个答案:

答案 0 :(得分:6)

适用于我,即使使用非协变的可变地图。

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)

如果Foo[T]中的T不协变,则最后一个命令(m += (2 -> new Foo[A]))将失败。

请注意,此代码有效,因为元组在其类型中也是协变的。

答案 1 :(得分:2)

严格地说,Java类型Map<String, List<? extends T>>写成:

Map[String, List[_ <: T]]