当我尝试编译以下代码时:
case class A(str: String) case class B[T <: A](t: T) def f[T <: A, X <: B[T]](x: X) = {} f(B(A("str")))
我收到以下错误:
推断类型参数[Nothing,B [A]]不符合方法f的类型参数边界[T <:A,X <:B [T]]
为什么编译器不能推断出T是A类?
当你说:
X <: B[T]
您正在定义一个新类型X,它没有类型参数,该类型参数具有混淆Scala编译器的类型参数 . 你实际上失去了T,因此A.
您需要创建一个类型X [C <:A],它是B [C]的子类型,因此您保留参数列表的盒装类型 . 然后在您的方法参数列表中,您可以直接将T(这是A的子类型)传递给X,并且Scala编译器有足够的数据来计算它 .
因此,以下编译与您的示例编译良好:
def f[T <: A, X[C <: A] <: B[C]](x: X[T])= {}
1 回答
当你说:
您正在定义一个新类型X,它没有类型参数,该类型参数具有混淆Scala编译器的类型参数 . 你实际上失去了T,因此A.
您需要创建一个类型X [C <:A],它是B [C]的子类型,因此您保留参数列表的盒装类型 . 然后在您的方法参数列表中,您可以直接将T(这是A的子类型)传递给X,并且Scala编译器有足够的数据来计算它 .
因此,以下编译与您的示例编译良好: