1

以下代码编译:

class X[U, T <: U]

object X {
  implicit def genericX[U, T <: U]: X[U, T] = new X[U, T]
}

implicitly[X[String, String]] // compiles

当我们制作T协变 ( class X[U, +T <: U]) 时,它也会编译:

class X[U, +T <: U]

object X {
  implicit def genericX[U, T <: U]: X[U, T] = new X[U, T]
}

implicitly[X[String, String]] // compiles

当我们制作T逆变(class X[U, -T <: U])时,编译器无法实现implicitly[X[String, String]]。奇怪的是,它能够实现implicitly[X[Any, Any]]

class X[U, -T <: U]

object X {
  implicit def genericX[U, T <: U]: X[U, T] = new X[U, T]
}

implicitly[X[Any, Any]] // compiles
implicitly[X[String, String]] // error: could not find an implicit value 

我怀疑尽管有明确的类型注释,但 typeT处于逆变位置,过早地固定为Any. 这是预期的行为吗?

奖励点:T如果我们修复,逆变确实有效U

class X[-T <: String]

object X {
  implicit def genericX[T <: String]: X[T] = new X[T]
}

implicitly[X[String]] // compiles

UPDATE1:Dmytro Mitin 回复后更新:

  class X[U, -T] // same behaviour for invariant T

  object X {
    implicit def genericX[U, T](implicit ev: T <:< U): X[U, T] = new X[U, T]
  }

  implicitly[X[AnyRef, AnyRef]] // compiles

  def check[T](implicit ev: X[AnyRef, T]): Unit = {}

  check[String] // compiles
  check // does not compile
4

0 回答 0