假设我有一个特征 Foo,类型参数为 T,并且我需要在 Foo 中使用 T 的 ClassTag:
trait Foo[T] {
implicit def ct: ClassTag[T]
}
我想在不在每个 Foo 实现中实现 ct 的情况下实现这一点。例如,我想避免每次都这样做:
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 ,因为它会递归地调用自身。