Scala 类型推断不一致性

Scala 类型推断不一致性,scala,generics,collections,containers,type-inference,Scala,Generics,Collections,Containers,Type Inference,假设我有一个包装器类 case class Cont [E] (e : Seq[E]) { def :: [E1 >: E] (e1 : Seq[E1]) : Cont[E1] = Cont(e1 ++ e) def + [E1 >: E] (e1 : Seq[E1]) : Cont[E1] = Cont(e1 ++ e) } 它是某种类型序列的包装器。它可以接受另一种类型的segunce,并返回附加序列的新包装器(现在带有它们的超类型类型)。它有两种实现方式——从右到左使

假设我有一个包装器类

case class Cont [E] (e : Seq[E]) {
  def :: [E1 >: E] (e1 : Seq[E1]) : Cont[E1] = Cont(e1 ++ e)
  def + [E1 >: E] (e1 : Seq[E1]) : Cont[E1] = Cont(e1 ++ e)
}
它是某种类型序列的包装器。它可以接受另一种类型的segunce,并返回附加序列的新包装器(现在带有它们的超类型类型)。它有两种实现方式——从右到左使用::和从左到右使用+

现在,这些是链接的结果:

Cont(Seq[Nothing]()) //-> Cont[Nothing]
Seq[Nothing]() :: Cont(Seq[Nothing]()) //-> Cont[Nothing]
Seq[Nothing]() :: Seq[Nothing]() :: Cont(Seq[Nothing]()) //-> Cont[E1]
Seq[Int]() :: Seq[Nothing]() :: Seq[Nothing]() :: Cont(Seq[Nothing]()) //-> Cont[Any]

Cont(Seq[Nothing]())//-> Cont[Nothing]
Cont(Seq[Nothing]()) + Seq[Nothing]()//-> Cont[Nothing]
Cont(Seq[Nothing]()) + Seq[Nothing]() + Seq[Nothing]() //-> Cont[Nothing]
Cont(Seq[Nothing]()) + Seq[Nothing]() + Seq[Nothing]() + Seq[Int]() //-> Cont[Int]

结果应该是一样的,还是不应该?他们不是。我需要第二种(从左到右)行为。我甚至不知道Cont[E1]是什么意思。这有什么原因吗?是否使用以下代码对代码进行了修复::?

您是否知道,在中缀“类运算符”形式中使用以冒号结尾的方法名是右关联的,并根据右操作数进行解析

换言之:

foo :: bar
相当于:

bar.::(foo)
而这:

foo + bar
相当于

foo.+(bar)

我相信这就解释了你所看到的
+

之间的差异。这似乎是一个bug-
Cont[E1]
不是一个有效的类型。此外,对于第三种情况,
Cont[Nothing]
足够了,对于第四种情况,
Cont[Int]
足够了。