【问题标题】:Wildcard with super [duplicate]带有超级的通配符[重复]
【发布时间】:2013-09-24 00:54:10
【问题描述】:

考虑

List<? super Integer> lst= new ArrayList<Number>();
lst.add(new Integer(3)); //ok- why?? I expected compile error "expected add(int, Object), found add(int,CAP#1)"
lst.get(0); //ok

List <? extends Number> nums= new ArrayList<Integer>();
lst.add(new Integer(3));//Compile error- expected add(int, Object), found add(int,CAP#1)

在编译状态下,我们不知道&lt;? extends Number&gt; 的类型并且有编译错误。我们知道编译状态下&lt;? super Integer&gt; 的类型吗?为什么?

【问题讨论】:

    标签: java wildcard


    【解决方案1】:

    当然 - 你知道,无论通配符的值是什么,它都是Integer 的超类(根据定义,从边界开始)。所以不管它的具体类是什么,你都有一个可以容纳Integer的东西的列表。在这种情况下,List&lt;Object&gt;List&lt;Number&gt;List&lt;Integer&gt; 一样有效。

    extends 然而,情况就不同了。 List&lt;? extends Number&gt; 可能是 List&lt;Double&gt;,因此很明显,在不违反类型安全的情况下不能将 Integer 插入此列表。 (事实上​​,除了null 之外,根本无法插入任何内容。)

    【讨论】:

    • 好的,谢谢。现在我不明白List&lt;? super Integer&gt; lst = new ArrayList&lt;Number&gt;();List&lt;Number&gt; lst = new ArrayList&lt;Number&gt;(); 有什么不同?
    • @St.Antario 这两行都涉及两件事。 首先,您定义一个名为lst 的变量,并说明它是什么类型。 然后,您构造一个对象并将其分配给该变量。对象的实际类型和变量的声明类型可以不同。比较 Object a = "hello";String b = "hello";,如果有帮助的话。两种情况下的实际字符串是相同的,但您不能调用a.length(),因为您对a 中的内容的唯一保证是它是Object
    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 2018-07-03
    • 2020-06-08
    • 1970-01-01
    • 2012-08-25
    • 2020-11-25
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多