Java规范在哪里说List<;T>;分配给列表<;?超级T>;?
假设类Java规范在哪里说List<;T>;分配给列表<;?超级T>;?,java,generics,bounded-wildcard,subtyping,Java,Generics,Bounded Wildcard,Subtyping,假设类B继承自类A。以下是合法的Java: List<A> x; List<? super B> y = x; 列表x; ListList分配列表来定义“子类型关系”是什么?泛型是不可重新定义的,所以我看不到你的观点。不幸的是,我能做的最好的事情就是说,子类型关系在规范的第4.10节中有定义。:)第一原则定义在这里没有帮助,因为它没有本地化规范的哪一部分说我的特定通配符是有效的。我看不到规范的子类型关系处理它,但我也看不到规范的assignsTo关系如何处理它,所以我不
B
继承自类A
。以下是合法的Java:
List<A> x;
List<? super B> y = x;
列表x;
ListList分配列表来定义“子类型关系”是什么?泛型是不可重新定义的,所以我看不到你的观点。不幸的是,我能做的最好的事情就是说,子类型关系在规范的第4.10节中有定义。:)第一原则定义在这里没有帮助,因为它没有本地化规范的哪一部分说我的特定通配符是有效的。我看不到规范的子类型关系处理它,但我也看不到规范的assignsTo关系如何处理它,所以我不知道。澄清一下,我谈论子类型的原因是assignsTo是根据扩展引用转换定义的,而扩展引用转换是根据子类型定义的。然而,assignsTo也是根据一堆其他关系来定义的,因此相关的位可能与子类型无关。我创建了这个社区wiki,因为我不确定我是否掌握了所有细节。语言律师,请纠正我的任何错误。“我不确定我所有的细节都是对的。”你做到了。正如我在问题中提到的,4.10.2要求对子类型应用捕获转换以找到其直接超类型。但是,在这种情况下,子类型是List
,因此不需要应用捕获转换。因此,我还不明白这一部分在我的情况下是如何工作的。啊,明白了。我错过了关键的C,其中Si包含Ti(1≤ 我≤ n) (§4.5.1)。
位。谢谢@杰弗里文实际上我想你是对的?super A
不会在作业上下文中捕获,但这并不重要。4.10.2和4.5.1中的摘录表明列表这是一个很好的解释,我希望我的问题是关于直观理解或安全性的语义证明。任何一个都会容易得多!:)不幸的是,我深陷于编译器内部,特别需要在规范中为这种情况定义assignsTo或subtype的位置。您完全正确地认为它应该与类型参数上的contains关系相关联,但不幸的是,我不知道如何关联。
List<A> <: List<? super B>
public class Generics {
static class Quux { }
static class Foo extends Quux { }
static class Bar extends Foo { }
public static void main(String... args) {
List<Foo> fooList = new ArrayList<>();
// This is legal Java
List<? super Bar> superBarList = fooList;
// So is this
List<? super Foo> superFooList = fooList;
// However, this is *not* legal Java
superBarList.add(new Quux());
// Neither is this
superFooList.add(new Quux());
// Or this:
superFooList.add(new Object());
// But this is fine
superFooList.add(new Foo());
}
}