Scala 存在类型
(更新:简化了代码并说明了为什么它应该工作) 如何修复此代码?:Scala 存在类型,scala,existential-type,Scala,Existential Type,(更新:简化了代码并说明了为什么它应该工作) 如何修复此代码?: case class Sub[B <: Seq[_] : Manifest](b: B) { def foo[B2 >: B <: Seq[_] : Manifest](other: Sub[B2]) : B2 = { println(manifest[B]) println(manifest[B2]) // next line doesn't compile // ot
case class Sub[B <: Seq[_] : Manifest](b: B) {
def foo[B2 >: B <: Seq[_] : Manifest](other: Sub[B2]) : B2 = {
println(manifest[B])
println(manifest[B2])
// next line doesn't compile
// other.b ++ b
other.b
}
}
如果我添加注释,代码将编译并运行它:
scala> Sub(List(1,2)).foo(Sub(Seq(4,5)))
scala.collection.immutable.List[Int]
scala.collection.Seq[Int]
res0: Seq[Int] = List(4, 5)
因此编译器知道元素的类型是List[Int]
和Seq[Int]
。将它们连接起来应该没有问题
注意:我希望保留“B2>:B”的用法,因为我需要对其进行推断 到目前为止,您已经丢失了Seq[u]的类型,因此唯一可能得到的B是Seq[Any]。。。因此,您可以将b安全地归于Seq[Any](b:Seq[Any])++b2
仅仅因为在B中保留了B,如果您不想使用存在类型,那么这应该是可行的:
case class Sub[T, B[X] <: Seq[X]](b: B[T]) {
def foo[B2[X] <: Seq[X]](other: Sub[T,B2]) =
other.b ++ b
}
case class Sub[T,B[X]错误消息指的是类型“That”和“Repr”。它们在哪里?+1,但应该是“…你可以将Seq[Any]归为B:(B:Seq[Any])++b2
”那么,b2是某些Seq的具体类型,因此编译器应该知道元素类型……此外,我知道问题所在,解决方案是什么[X,B2[X]查看我更新的问题。编译器非常清楚确切的答案types@IttayDB类型可能包含所有信息,但由于存在性,您已经失去了推断Seq类型参数的能力。编译器无法在运行时证明,因为它对B的了解最多是它将Seq[A]子类化对于某些{typea},它没有关于存在类型的信息A@IttayD[X,B2[X]我接受这一点,尽管它不能解决我真正的问题,因为它解决了问题(在我的原始代码中,也存在继承问题,导致在使用Sub(List(1))时将“t”推断为无)。注意:此类型:B[X]
case class Sub[T, B[X] <: Seq[X]](b: B[T]) {
def foo[B2[X] <: Seq[X]](other: Sub[T,B2]) =
other.b ++ b
}