无法推断二次类型参数

时间:2017-03-24 01:13:18

标签: scala

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

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&lt;:A,X&lt;:B [T]]

为什么编译器不能推断T是A类型的?

1 个答案:

答案 0 :(得分:1)

当你说:

X <: B[T]

您正在定义一个新类型X,该类型没有类型参数来自 具有混淆Scala编译器的类型参数的类型。你实际上失去了T,因此失去了A.

您需要创建一个类型X [C&lt;:A],它是B [C]的子类型,因此您保留参数列表的盒装类型。然后在您的方法参数列表中,您可以直接将T(这是A的子类型)传递给X,并且Scala编译器有足够的数据来计算它。

因此,下面的例子很适合你的例子:

def f[T <: A, X[C <: A] <: B[C]](x: X[T])= {}