以下代码编译:
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