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]
足够了。