加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

泛型类型的Java容器

发布时间:2020-12-15 05:23:08 所属栏目:Java 来源:网络整理
导读:我正在准备考试,教授给我们的一个代码对我来说是模糊的: public class Z { static java.util.LinkedList? extends Object a = new java.util.LinkedListString(); public static void main(String[] args) { a.add(null); // 1 a.add(new Object()); // 2 a
我正在准备考试,教授给我们的一个代码对我来说是模糊的:

public class Z {

    static java.util.LinkedList<? extends Object> a =
            new java.util.LinkedList<String>();

    public static void main(String[] args) {
        a.add(null); // 1
        a.add(new Object()); // 2
        a.add("new Object()"); // 3
        System.out.println(a); // 4
    }
}

NetBeans在这里给我带来了非常奇怪的编译错误:

no suitable method found for add(java.lang.Object)
method java.util.LinkedList.add(capture#1 of ? extends java.lang.Object) is not applicable
(actual argument java.lang.Object cannot be converted to capture#1 of ? extends java.lang.Object by method invocation conversion)

no suitable method found for add(java.lang.String)
method java.util.LinkedList.add(capture#2 of ? extends java.lang.Object) is not applicable
(actual argument java.lang.String cannot be converted to capture#2 of ? extends java.lang.Object by method invocation conversion)

有人可以解释一下这些错误吗?我很确定应该可以将String对象添加到此列表中.

解决方法

PECS – 生产者扩展,消费者超级 – 这是布洛赫提出的一个助记符,以应对上述问题.

换句话说,如果使用扩展,则只能从集合中生成元素.如果你想要它消耗元素 – 使用超级.

重点是强制编译时安全.如果你的收藏被定义了?扩展SomeBaseClass,这意味着“它可以包含基类的单个子类的实例”.在您的情况下,您正在定义新的LinkedList< String>(),但是您尝试添加一个Object – 这不应该被允许,并且它被编译器捕获.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读