Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java规范在哪里说List<;T>;分配给列表<;?超级T>;?_Java_Generics_Bounded Wildcard_Subtyping - Fatal编程技术网

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;

List
List分配列表来定义“子类型关系”是什么?泛型是不可重新定义的,所以我看不到你的观点。不幸的是,我能做的最好的事情就是说,子类型关系在规范的第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());
    }
}