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