2.7中的Scala类型失败:是否有解决方法?

时间:2010-04-12 15:27:15

标签: generics scala scala-2.8 type-inference

使用参数化类作为Map的键类型时遇到问题。首先创建参数化类:

scala> sealed abstract class Foo[T]{  def t: T }
defined class Foo

现在在未知参数中创建一些虚构的集合:

scala> var l: List[Foo[_]] = Nil
l: List[Foo[_]] = List()

现在创建一个Map来存储它们:

scala> var mm: Map[Foo[_], Any] = Map.empty
mm: Map[Foo[_],Any] = Map()

现在尝试填充地图

scala> l.foreach { foo: Foo[_] =>
     | mm += (foo -> "BAR")
     | }

给我以下编译器错误:

<console>:9: error: type mismatch;  
found   : foo.type (with underlying type Foo[_])  
required: Foo[_$1] where type _$1  
       mm += (foo -> "BAR")  
              ^

这在2.8中编译得很好。是否有任何解决方法可以在2.7中使用它?

编辑 - 这对我也很有用:

var mm: Map[AnyRef, Any] = Map.empty //note not Foo[_]

scala> l.foreach { foo: Foo[_] =>
     | mm += ( (foo: AnyRef) -> "BAR") //still have to tell compiler foo is an AnyRef
     | }

1 个答案:

答案 0 :(得分:1)

这个适用于我(即使在Scala 2.7中):

scala> l.foreach { foo: Foo[_] =>
     | mm += (foo.asInstanceOf[Foo[_]] -> "BAR")
     | }

很奇怪,但这似乎是2.7中的一个错误,已在2.8中修复。