Scala 高级金德类型推理

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)

(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)

  // 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]
是协变的,因此在我的理解中,这应该是可以推断的。此外,这个问题存在于任何最小公分母,而不仅仅是
任何