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