我想创建一个类型类,将其定义的抽象类型限制为具有 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/