【问题标题】:Scala Type Failure in 2.7: is there a workaround?2.7 中的 Scala 类型失败:有解决方法吗?
【发布时间】:2011-02-07 01:39:13
【问题描述】:

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

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
     | }

【问题讨论】:

    标签: generics scala scala-2.8 type-inference


    【解决方案1】:

    这个对我很有效(即使在 Scala 2.7 中):

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多