2011-08-04 126 views
3

以我使用情况下,我有协变型的Foo [+ T]和类A类<:T,B <:T,C <:T, 我需要存储一个地图“A” - >一个Foo [A]实例,“B” - >一个Foo [B]实例和“C” - >一个Foo [C]实例,这在scala中是可能的吗?地图<字符串,列表<? extends T>> Scala中

目前我宣布我的地图为Map [String,Foo [T]]]但我不能在里面添加Foo [A],编译器告诉我Foo [T]而不是Foo [A],这似乎是由Map参数缺乏协变性引起的,是否有解决方案?

我现在的解决方法是去参数化Foo并投入代码中,这当然不会让我满意,我也看到我可以使用java集合,但我宁愿留在scala中。

预先感谢您的时间

+0

你说的是可变的或不可变的地图?与不可变的地图,值类型协变... –

+0

哦,对,我实际上使用HashMap实现作为Java的愚蠢反射,这是scala中的错误,而HashMap不是协变>< – jolivier

回答

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 -> [email protected]) 

scala> m += (2 -> new Foo[A]) 
res0: m.type = Map(2 -> [email protected]) 

如果Foo[T]不是在T协变,那么最后的命令(m += (2 -> new Foo[A]))将失败。

请注意,此代码的工作原理是因为元组的类型也是协变的。

+0

是的抱歉,我发布的问题与我在代码中遇到的问题不同,因为我仍然拥有Java Reflex Map接口 - > HashMap实现,它在scala中是错误的,因为Map是协变的而不是HashMap,谢谢 – jolivier

2

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

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

这应该是公认的答案。 – belka

相关问题