Сбой компилятора 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, это поможет людям, которые споткнуться об этом в будущем.