gpt4 book ai didi

java - Java 上的通配符和子类型

转载 作者:太空宇宙 更新时间:2023-11-04 14:39:01 25 4
gpt4 key购买 nike

我刚刚开始学习 Java 上的通配符和子类型,并尝试测试我学到的东西。

假设:

Class A { public int y=1; }
Class B extends A { public int x=2; }

主要内容:

List<B> lb = new ArrayList<>();
lb.add(new B());
System.out.println(lb.get(0).y); //Displays member y of Class A
List<? extends A> la = lb;
System.out.println(la.get(0).y); //Can access member y of Class A

List<A> la1 = new ArrayList<>();
la1.add(new A());
System.out.println(la1.get(0).y); //Displays member y of Class A
List<? super B> lb1 = la1;
System.out.println(lb1.get(0).y); //Cannot access member y of Class A? Why?

我不明白为什么我无法使用下限通配符访问成员 y,而可以使用上限通配符。我错过了什么吗?

最佳答案

考虑

Interface X { ... }
Class A { public int y=1; }
Class B extends A implements X { public int x=2; }

List<? super B> lb1 = la1;

现在,lb1 中的对象可以与 AB 完全无关,只要它们实现了 X >。编译器无法知道 lb1.get(0) 有成员 y

一个更“具体”的例子:

Class X { ... }
Class A extends X { public int y=1; }
Class B extends A { public int x=2; }

使用此层次结构,lb1 中的对象可以是没有成员 yX 类型。

关于java - Java 上的通配符和子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25195896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com