scala - 读取 trait 中的类型参数 Class Type

标签 scala guice classtag

假设我有一个特征 Foo,带有类型参数 T,我需要一个 T 的 ClassTag 才能在 Foo 中使用:

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 进行依赖注入(inject),并且它无法处理构造函数中的隐式类型标记参数。所以这样的事情不是一个选择:

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,因为它递归地调用自身。

最佳答案

可以用抽象类代替 trait 吗?

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

关于scala - 读取 trait 中的类型参数 Class Type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55837558/

相关文章:

java - 列出的哪个 .jar 包含类 'com.twitter.finagle.stats.ExceptionStatsHandler' ?

java - Tomcat 启动期间出错 - com.google.inject.internal.util.$ComputationException : java. lang.ArrayIndexOutOfBoundsException

java - play 2.5 生产模式无法在应用程序启动时运行的 Singleton 类中使用注入(inject)的 ConfigurationProvider 类对象

java - 配置 Guice 模块提供的对象

scala - 榕树配置加载通用

scala T 不是一个类

scala - 隐式获取抽象类型的 ClassTag

像数据结构这样的scala动态多维可变数组

scala - 从 Java #map 调用 Scala Monad

scala - 如何在 Scala 中单独存储 HashMap 值?