2011-08-04 62 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

相關問題