在我的用例中,我有一个具有协变类型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。
提前感谢您的时间
答案 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]]