列表 lsb = new ArrayList(); java中的逻辑错误?

我们有:

class A{}
class B extends A{}
class C extends B{}
class D extends C{}

我们可以像这样定义列表:

List<? super B> lsb1 = new ArrayList<Object>();
//List<? super B> lsb2 = new ArrayList<Integer>();//Integer, we expect this    
List<? super B> lsb3 = new ArrayList<A>();
List<? super B> lsb4 = new ArrayList<B>();
//List<? super B> lsb5 = new ArrayList<C>();//not compile
//List<? super B> lsb6 = new ArrayList<D>();//not compile

现在我们创建一些对象:

Object o = new Object();
Integer i = new Integer(3);
A a = new A();
B b = new B();
C c = new C();
D d = new D();

我将尝试将这些对象添加到列表中:

List<? super B> lsb = new ArrayList<A>();
lsb.add(o);//not compile
lsb.add(i);//not compile 
lsb.add(a);//not compile
lsb.add(b);
lsb.add(c);
lsb.add(d);

问题:

为什么当我定义 ListList< 的引用时? super B> 我可以使用 new ArrayList<>(); ,它可以具有 B、A、Object 的元素类型(我期望如此),但是当我向此列表添加元素时,可以仅添加类型为 B、C、D 的对象吗?

We have:

class A{}
class B extends A{}
class C extends B{}
class D extends C{}

we can define Lists like:

List<? super B> lsb1 = new ArrayList<Object>();
//List<? super B> lsb2 = new ArrayList<Integer>();//Integer, we expect this    
List<? super B> lsb3 = new ArrayList<A>();
List<? super B> lsb4 = new ArrayList<B>();
//List<? super B> lsb5 = new ArrayList<C>();//not compile
//List<? super B> lsb6 = new ArrayList<D>();//not compile

now we crate some objects:

Object o = new Object();
Integer i = new Integer(3);
A a = new A();
B b = new B();
C c = new C();
D d = new D();

I will try to add this objects to List:

List<? super B> lsb = new ArrayList<A>();
lsb.add(o);//not compile
lsb.add(i);//not compile 
lsb.add(a);//not compile
lsb.add(b);
lsb.add(c);
lsb.add(d);

Question:

Why when I define reference for List<? super B> can I use new ArrayList<>(); which can have elements type of B, A, Object (I expected this), but when I add elements to this list can I add only objects with type B, C, D?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

狼亦尘 2024-08-22 07:49:10

此处 @ JavaRanch 常见问题解答进行了精彩的解释。

Explained beautifully here @ JavaRanch FAQs.

戏剧牡丹亭 2024-08-22 07:49:10

列表 是一个 List,其确切组件类型未知。编译器只知道组件类型是 BAObject

它可以是一个List

如果它是 List,则无法添加元素 A

这是为了防止数组可能发生以下情况:

String[] x = new String[10];
Object[] x2 = x;
x2[0] = 123; // not a String, compiles, but crashes at run-time

A List<? super B> is a List, whose exact component type is unknown. All the compiler knows is that the component type is B, A or Object.

It could be a List<B>.

If it is a List<B>, you cannot add an element A.

This is to prevent the following, which can happen with arrays:

String[] x = new String[10];
Object[] x2 = x;
x2[0] = 123; // not a String, compiles, but crashes at run-time
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文