B
继承自类A
。下面的Java代码是合法的:List<A> x;
List<? super B> y = x;
就规范而言,这意味着 List<A>
赋值给 List<? super B>
。然而,我找不到规范中说这是合法的部分。特别是,我认为我们应该有子类型关系。
List<A> <: List<? super B>
但是Java 8规范的第4.10节将子类型关系定义为直接超类型关系“S >1 T”的传递闭包,并且它根据一个计算
T
的一组超类型的有限函数来定义直接超类型关系。由于可能存在任意数量从A
继承的B
,因此不存在一个有界函数,可以在输入List<A>
时生成List<? super B>
,因此规范的子类型定义似乎对超级通配符失效。4.10.2节“类和接口类型之间的子类型”确实提到了通配符,但它只处理通配符出现在潜在子类型中的另一个方向(这个方向适合于计算的直接超类型机制)。问题:规范的哪一部分说明上述代码是合法的?
这是针对编译器代码的动机,所以仅凭直觉理解其合法性或想出处理它的算法是不够的。由于Java中的常规子类型问题是不可判定的,因此我希望能处理与规范完全相同的情况,因此需要处理此案例的规范部分。