У меня есть отражающая функция с неявным параметром TypeTag:
def fromOptionFn[R: TypeTag](self: Int => Option[R]): Wrapper[R] = {
println(TypeTag[R])
...
}
Что по неизвестной причине не работает (см. -parame">Как сделать вывод типа Scala достаточно мощным, чтобы обнаружить параметр универсального типа?):
> fromOptionFn2(v => Some(" + _))
> typeTag(Any)
Я предполагаю, что это вызвано выводом R из Option[R], поэтому я немного улучшаю его:
def fromOptionFn[R, Opt <: Option[R]: TypeTag](self: Int => Opt): Wrapper[R] = {
println(typeTag[Opt])
...
}
На этот раз все еще хуже, даже не компилируется, ошибка явно указывает на то, что scala недостаточно умен для анализа типа:
> fromOptionFn2(v => Some(" + _))
Error: inferred type arguments [Nothing,Option[String]] do not conform to method fromOptionFn's type parameter bounds [R,Opt <: Option[R]]
Итак, как мне временно обойти эту проблему компиляции? (Конечно, я могу сообщить об этом на трекере Lightbend, но это слишком медленно)
ДОПОЛНЕНИЕ. Эта проблема сама по себе является попыткой обхода для Как сделать вывод типа Scala достаточно мощным, чтобы обнаруживать параметр универсального типа?, который может не быть исправлен. В моем случае я не против получить TypeTag типа R или Option[R], все работает.