读取类型参数Class Type in trait

问题描述 投票:2回答:1

假设我有一个特性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进行依赖注入,并且它无法处理构造函数中的隐式类型标记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中,因为它以递归方式调用自身。

scala guice classtag
1个回答
5
投票

你能用抽象类代替特质吗?

abstract class Foo[T](implicit val ct: ClassTag[T]) {
}
© www.soinside.com 2019 - 2024. All rights reserved.