我昨天在这里发布了这个问题的(looong)版本: 类型差异问题
为了缩短(真的)长话短说,这个:
class A[-P, T <: P]
不编译(它抱怨说“P 出现在类型 <: T 类型的 P 中的协变位置”)。对我之前的问题的回答表明该声明确实无效,因为A[Foo, Bar]
它将是 的子类A[Nothing, Bar]
,但后者是非法的(Bar
不是 的子类Nothing
)。
我不认为这是足够的理由。按照这种逻辑,这样的事情也应该是非法的:class B[+T <: String]
-B[String]
应该是的子类,B[Any]
但后者是无效的。
此外,这:
class C[T, -P >: T]
实际上确实编译。这与上面的内容本质上不一样A
吗?