读取特征中类型参数的ClassType

时间:2019-04-24 19:50:07

标签: scala guice classtag

假设我有一个特征Foo,类型参数为T,并且我需要在Too中使用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]]
}

此外,由于我使用Guice进行依赖项注入,因此在实现的构造函数中隐式接收TypeTag也不是一种选择,并且它不能处理构造函数中的隐式类型标记param。所以这样的事情是不可行的:

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,因为它是递归调用的。

1 个答案:

答案 0 :(得分:5)

可以使用抽象类代替特征吗?

abstract class Foo[T](implicit val ct: ClassTag[T]) {
}