scala中特征的推断
Inference of traits in scala
我在 Scala 中进行类型推断时遇到问题。我将 类 与更高级的类型一起使用,它扩展了一些特征;但是 scala 编译器无法将类型解析为它们扩展的特征。此处显示了最小示例:
trait traitA[X]
trait traitB[X]
class A[X] extends traitA[X] {}
class B extends traitB[C] {}
class C {}
val a = Seq[A[B]]()
val b: Seq[traitA[traitB[C]]] = a
Error: type mismatch;
found : Seq[A[B]]
required: Seq[traitA[traitB[C]]]
val b: Seq[traitA[traitB[C]]] = a
我可以得到 Seq[traitA[B]] 但不是 Seq[traitA[traitB[C]]]。
我在这里错过了什么?
感谢帮助
你必须在 traitA
中要求协方差,如下所示:
trait traitA[+X]
你会得到:
scala> val b: Seq[traitA[traitB[C]]] = a
res0: Seq[traitA[traitB[C]]] = List()
为什么?因为 A[X]
是 traitA[X]
的子类型,并且您想强制执行 Seq[A[X]]
也是 Seq[traitA[X]]
.
的子类型
我在 Scala 中进行类型推断时遇到问题。我将 类 与更高级的类型一起使用,它扩展了一些特征;但是 scala 编译器无法将类型解析为它们扩展的特征。此处显示了最小示例:
trait traitA[X]
trait traitB[X]
class A[X] extends traitA[X] {}
class B extends traitB[C] {}
class C {}
val a = Seq[A[B]]()
val b: Seq[traitA[traitB[C]]] = a
Error: type mismatch;
found : Seq[A[B]]
required: Seq[traitA[traitB[C]]]
val b: Seq[traitA[traitB[C]]] = a
我可以得到 Seq[traitA[B]] 但不是 Seq[traitA[traitB[C]]]。
我在这里错过了什么?
感谢帮助
你必须在 traitA
中要求协方差,如下所示:
trait traitA[+X]
你会得到:
scala> val b: Seq[traitA[traitB[C]]] = a
res0: Seq[traitA[traitB[C]]] = List()
为什么?因为 A[X]
是 traitA[X]
的子类型,并且您想强制执行 Seq[A[X]]
也是 Seq[traitA[X]]
.