我想创建一个类型类,将其定义的抽象类型限制为具有 ClassTag 。这是一个简化的示例:

trait A[T] {
  type B <: Z

  val tag = implicitly[ClassTag[B]]
}

// Error:(8, 24) No ClassTag available for A.this.B
//  val tag = implicitly[ClassTag[B]]
                  ^

我需要 B 来拥有 ClassTag[B] 并且我不能像 A 那样定义 trait A[T, B: ClassTag] ,因为我希望 A 隐式地可用于 T ,就像在 def foo[T: A](t: T) 中一样。 B 也必须是某个 Z 的上限,但这似乎没有区别。

有没有办法在 ClassTag 上表达 B 约束?

最佳答案

编译器无法在这里为您提供 ClassTag,因为它不知道 B 最终可能是什么。

改为抽象的 def ,并让 A 的具体实现提供它:

trait A[T] {
  type B <: Z
  def tag: ClassTag[B] // you may want to declare it as implicit
}

并且,例如,
new A[Int] {
  type B = Z
  def tag = implicitly
}

关于scala - 类型类参数的 ClassTag,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36330798/

10-10 22:37