我有一个泛型类型的复杂用例,下面对此进行了简化
trait A
class AB extends A{
val v = 10
}
trait X[T<:A]{
def request: T
}
class XY extends X[AB]{
def request = new AB()
}
class Test extends App{
/**
* X[A]
* X[AB]
* XY[A]
* XY[AB]
*/
def test[C<:A, D <: X[C]](t:Int)(input: D): Unit ={
print(input.getClass.getName)
}
implicit val req = new XY()
test(2)(req)
}
test方法应支持注释部分中定义的类型方案。我收到以下编译错误。
Error:(33, 7) inferred type arguments [XY] do not conform to method test's type parameter bounds [D <: X[Nothing]] test(2)(req)
这在语法上合法吗? 预先感谢。
答案 0 :(得分:2)
答案 1 :(得分:1)
编译器无法通过这样的定义分两步推断C
的类型。
通过在D
参数的定义中同时包含C
和input
,编译器可以一步一步完成它:
def test[C <: A, D <: X[C]](t: Int)(input: D with X[C]): Unit
或者具有D <: X[C]
的隐式证据,这将有助于编译器分两步来推断C
:
def test[C <: A, D <: X[_]](t: Int)(input: D)(implicit ev: D <:< X[C]): Unit