Gon*_*lmo 3 scala guice classtag
假设我有一个特征Foo,类型参数为T,并且需要在Foo中使用T的ClassTag:
trait Foo[T] {
implicit def ct: ClassTag[T]
}
Run Code Online (Sandbox Code Playgroud)
我想在每个Foo实现中都没有实现ct的情况下实现这一目标。例如,我想避免每次都要这样做:
class Bar extends Foo[String] {
implicit def ct: ClassTag[String] = implicitly[ClassTag[String]]
}
Run Code Online (Sandbox Code Playgroud)
另外,由于我使用Guice进行依赖项注入,因此在实现的构造函数中接收隐式TypeTag也不是一种选择,并且它不能处理构造函数中的隐式类型标记param。所以这样的事情不是一个选择:
class Bar(implicit val ct: ClassTag[String]) extends Foo[String]
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想要这样的东西:
object Main extends App {
trait Foo[T] {
implicit def ct: ClassTag[T] = implicitly[ClassTag[T]]
}
class Bar extends Foo[String] {
println(ct)
}
new Bar
}
Run Code Online (Sandbox Code Playgroud)
但是上面的代码最终在运行时出现StackOverflowError,因为它是递归调用的。
可以使用抽象类代替特征吗?
abstract class Foo[T](implicit val ct: ClassTag[T]) {
}
Run Code Online (Sandbox Code Playgroud)