Scala 高级金德类型推理
(Scala 2.11.8) 考虑以下代码段:Scala 高级金德类型推理,scala,type-inference,typechecking,Scala,Type Inference,Typechecking,(Scala 2.11.8) 考虑以下代码段: class Case2 { trait Container[+A] { def addAll[B >: A, T2 <: Container[B]](that: T2): Boolean } def t1: Container[String] = ??? def t2: Container[Int] = ??? // Works t1.addAll[Any, Container[Any]](t2)
class Case2 {
trait Container[+A] {
def addAll[B >: A, T2 <: Container[B]](that: T2): Boolean
}
def t1: Container[String] = ???
def t2: Container[Int] = ???
// Works
t1.addAll[Any, Container[Any]](t2)
// Errors:
//* type mismatch; found : Case2.this.Container[Int] required: T2
//* inferred type arguments [String,Case2.this.Container[Int]] do not conform to method addAll's type parameter bounds [B >: String,T2 <: Case2.this.Container[B]]
t1.addAll(t2)
}
class Case2{
特征容器[+A]{
def addAll[B>:A,T2创建了一个被关闭为“超出范围”的
报价人:
类型推断不支持引用其他类型参数的边界
已创建,已关闭为“超出范围”
报价人:
类型推断不支持引用其他类型参数的边界
不是答案,但您确实需要T2
?defaddall[B>:A](即:容器[B])吗:Boolean
应该可以工作,并且更像您在这种情况下通常看到的。不幸的是,在实际代码中,存在依赖于T2
的类型约束,因此我认为这是不可能的。上面的代码片段是我在调查原始代码中的问题时提出的简化。实际上,您似乎是个蠢货插入Container[Int]:String
。如果您显式地将B设置为Any,它将工作(正如您所发现的),但我认为类型推断系统不允许将Any替换为“解决方案”。不过,我不能100%肯定这一点。我显式地定义了trait Container[+a]
是协变的,因此在我的理解中这应该是可以推断的。此外,这个问题存在于任何最小公分母,不仅仅是any
不是答案,而是您真的需要T2
?def addAll[B>:A](即:容器[B]):Boolean
应该可以工作,并且更像您在这种情况下通常看到的。不幸的是,在实际代码中,存在依赖于T2
的类型约束,因此我认为这是不可能的。上面的代码片段是我在调查原始代码中的问题时提出的简化。实际上,您似乎是个蠢货插入Container[Int]:String
。如果您显式地将B设置为Any,它将工作(正如您所发现的),但我认为类型推断系统不允许将Any替换为“解决方案”。不过,我不能100%肯定这一点。我显式地定义了trait Container[+a]
是协变的,因此在我的理解中,这应该是可以推断的。此外,这个问题存在于任何最小公分母,而不仅仅是任何