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