首页 文章

无法推断二次类型参数

提问于
浏览
0

当我尝试编译以下代码时:

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类?

1 回答

  • 1

    当你说:

    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])= {}
    

相关问题