2010-04-12 77 views
2

我有一个使用参数化类作为Map的键类型的问题。首先创建的参数化类:2.7中的Scala类型失败:是否有解决方法?

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

现在创建的这些跨未知参数的一些假想的集合:

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

现在创建一个映射到存储这些在:

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

这一个很适合我(甚至在斯卡拉2.7):

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

奇怪,但是这似乎真的是一个2.7中的bug已经在2.8中修复。

+0

我愚蠢的没有尝试 - 请参阅编辑为我工作的东西 – 2010-04-13 08:42:43

相关问题