Сбой компилятора Scala 2.11.5 с псевдонимами и манифестами типов

Похоже, что передача псевдонима параметризованного типа с подстановочными символами в функцию, которая пытается получить неявный Manifest для типа произойдет сбой компилятора Scala 2.11.5.

Следующее может быть вставлено в REPL 2.11.5 для воспроизведения аварии:

class C[T]
def f[T](implicit m: Manifest[T]) = 0

type CAlias = C[_]
val x = f[CAlias]

Вывод сбоя очень подробный, но содержит следующую информацию:

scala.reflect.internal.FatalError:
  ?MethodType?
     while compiling: <console>
        during phase: globalPhase=erasure, enteringPhase=posterasure
     library version: version 2.11.5
    compiler version: version 2.11.5
  reconstructed args:

  last tree to typer: type $iw
       tree position: line 9 of <console>
            tree tpe: <notype>
              symbol: object $iw
   symbol definition: class $iw extends Object (a ModuleClassSymbol)
      symbol package: $line10
       symbol owners: object $iw -> object $iw -> object $read
           call site: object $iw in package $line10

Есть несколько условий для этого сбоя. Тип C должен быть параметризован. Псевдоним должен использовать подстановочный знак (C[_]). Вызов должен использовать псевдоним типа, просто вызов f[C[_]] работает отлично.

В моей программе дело гораздо сложнее, и единственное решение, которое я нашел, - это чтобы метод не принимал Manifest, но просто возьми Class параметр вместо этого, который уродлив.

Я делаю что-то неправильно? Любые предложения для лучшего обхода? Я не видел ошибки в трекере ошибок Scala, так что, если она кажется действительной, я сообщу об этом.

1 ответ

Решение

Использование scala.reflect.runtime.universe.TypeTag (или же scala.reflect.ClassTag если этого достаточно; так как вы упомянули взятие Class как вариант, может быть) вместо Manifest, Они вставляются компилятором как неявные аргументы так же, как Manifestс. См. http://docs.scala-lang.org/overviews/reflection/typetags-manifests.html для получения дополнительной информации. В частности, обратите внимание

В Scala 2.10 scala.reflect.ClassManifests не рекомендуется использовать, и планируется отказаться от scala.reflect.Manifest в пользу TypeTags и ClassTags в следующем выпуске.

Вы, вероятно, все еще должны сообщить об ошибке; даже если он помечен как wont-fix, это поможет людям, которые споткнуться об этом в будущем.

Другие вопросы по тегам