Допустим, у меня есть черта Foo с параметром типа T, и мне нужно использовать ClassTag T для использования в Foo:
trait Foo[T] {
implicit def ct: ClassTag[T]
}
Я хочу достичь этого без использования ct в каждой реализации Foo. например Я хочу избежать этого каждый раз:
class Bar extends Foo[String] {
implicit def ct: ClassTag[String] = implicitly[ClassTag[String]]
}
Кроме того, получение TypeTag неявного в конструкторе реализаций не вариант, так как я использую Guice для внедрения зависимостей, и он не может обработать неявный параметр типа тега в конструкторе. Так что как то так не вариант:
class Bar(implicit val ct: ClassTag[String]) extends Foo[String]
В идеале я хочу что-то вроде этого:
object Main extends App {
trait Foo[T] {
implicit def ct: ClassTag[T] = implicitly[ClassTag[T]]
}
class Bar extends Foo[String] {
println(ct)
}
new Bar
}
Но приведенный выше код заканчивается во время выполнения StackOverflowError, поскольку он вызывает себя рекурсивно.