假设 classB
继承自 class A
。以下是合法的Java:
List<A> x;
List<? super B> y = x;
根据规范,这意味着List<A>
assignsTo List<? super B>
。但是,我很难找到说明这是合法的规范部分。特别是,我相信我们应该有子类型关系
List<A> <: List<? super B>
但是 Java 8 规范的第 4.10 节将子类型关系定义为直接超类型关系的传递闭包S >1 T
,并且它根据计算一组超类型的有限函数来定义直接超类型关系T
。没有可以在输入List<A>
上产生的有界函数,List<? super B>
因为可能有任意数量的B
s 继承自A
,因此规范的子类型定义似乎对超级通配符不适用。关于“类和接口类型之间的子类型化”的第 4.10.2 节确实提到了通配符,但它只处理通配符出现在潜在子类型中的另一个方向(这个方向适合计算的直接超类型机制)。
问题:规范的哪一部分说上述代码是合法的?
动机是编译器代码,因此仅凭直觉理解为什么它是合法的或想出一个处理它的算法是不够的。由于 Java 中的一般子类型问题是无法确定的,我想处理与规范完全相同的情况,因此想要处理这种情况的规范部分。