ClassTag用于类类参数

时间:2016-03-31 10:28:25

标签: scala types

我想创建一个类型类,将其定义的抽象类型约束为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约束?

1 个答案:

答案 0 :(得分:4)

编译器无法在此处为您提供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
}