【问题标题】:Map<String, List<? extends T>> in Scala地图<字符串,列表<?在 Scala 中扩展 T>>
【发布时间】:2011-08-04 21:53:13
【问题描述】:

在我的用例中,我有一个协变类型 Foo[+T] 和类 A <: t b c> 一个 Foo[A] 实例、“B”-> 一个 Foo[B] 实例和“C”-> 一个 Foo[C] 实例,这在 scala 中是否可行?

目前我将我的地图声明为 Map[String, Foo[T]]] 但是我不能在里面添加 Foo[A],编译器告诉我 Foo[T] 是预期的,而不是Foo[A],好像是Map参数缺少协方差造成的,有解决办法吗?

我现在的解决方法是对 Foo 进行反参数化并在代码中进行强制转换,这当然不令我满意,我还看到我可以使用 java 集合代替,但我更喜欢使用 scala。

提前感谢您的宝贵时间

【问题讨论】:

  • 你说的是可变地图还是不可变地图?对于不可变映射,值类型是协变的......
  • 哦,对了,我实际上是在使用 HashMap 实现作为 Java 的愚蠢反射,这在 scala 中是错误的,并且 HashMap 不是协变的 >

标签: scala covariance scala-collections


【解决方案1】:

对我有用,即使是非协变可变地图。

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 -&gt; new Foo[A])) 将会失败。

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

【讨论】:

  • 是的,抱歉,我发布的问题与我在代码中遇到的问题不同,因为我仍然有 Java Reflex Map 接口 -> HashMap 实现在 scala 中是错误的,因为 Map 是协变的,但不是 HashMap ,谢谢
【解决方案2】:

严格来说,Java类型Map&lt;String, List&lt;? extends T&gt;&gt;写成:

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

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 1970-01-01
    • 2012-01-07
    • 2020-08-10
    • 2012-03-13
    • 2017-11-07
    • 2012-04-06
    • 2020-07-06
    • 1970-01-01
    相关资源
    最近更新 更多