Scala Type Failure в 2.7: есть ли обходной путь? - PullRequest
2 голосов
/ 12 апреля 2010

У меня проблема с использованием параметризованного класса в качестве типа ключа 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
     | }

1 Ответ

1 голос
/ 13 апреля 2010

Это хорошо работает для меня (даже в Scala 2.7):

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

Странно, но на самом деле это ошибка 2.7, которая была исправлена ​​в 2.8.

...