通用类型的Scala组成

时间:2019-06-27 12:17:06

标签: scala generics

我有一个泛型类型的复杂用例,下面对此进行了简化

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)

这在语法上合法吗? 预先感谢。

2 个答案:

答案 0 :(得分:2)

Nothing出现编译错误通常表示未推断出某种类型。

尝试明确指定类型参数

test[AB, XY](2)(req)

Decimal

答案 1 :(得分:1)

编译器无法通过这样的定义分两步推断C的类型。

通过在D参数的定义中同时包含Cinput,编译器可以一步一步完成它:

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