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
}