java - 数组列表 <? super Number> 和 Double

标签 java generics

<分区>

来自 http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ103 :

A wildcard with a lower bound looks like " ? super Type " and stands for the family of all types that are supertypes of Type , type Type being included. Type is called the lower bound .

为什么

ArrayList<? super Number> psupn1 = new ArrayList<Number>();
psupn1.add(new Double(2));

编译了吗?

Double 不是 Number 的父类(super class)型而是 Number 的子类...

编辑 1:

    ArrayList<? super Number> pextn1 = new ArrayList<Number>();
    psupn1.add(new Integer(2));
    psupn1.add(new Double(2));
    psupn1.add(new Float(2));
    for(Number n : psupn1){ // [Invalid] Number should be change to
    // Object even if I can only add subtype of Number??

    }

最佳答案

您可以向其添加一个Double,因为无论类型参数E 是什么,它都保证是Number 或父类(super class)型...这意味着您绝对可以将 Double 转换为 E。你将无法做到:

Number x = psupn1.get(0);

不过。

考虑一下,并尝试创建逻辑上会打破这一点的列表。例如,您不能使用:

// Invalid
ArrayList<? super Number> psupn1 = new ArrayList<Integer>();
psupn1.add(new Double(2));

因为 Integer 既不是 Number 也不是父类(super class)型 - 它是一个子类。你可以这样写:

// Valid
ArrayList<? extends Number> psupn1 = new ArrayList<Integer>();

... 因为情况正好相反。那时你可以写:

Number x = psupn1.get(0);

因为列表中的任何元素都保证可以转换为 Number。这都是关于需要以何种方式进行转换 - 泛型类型参数或它。

关于java - 数组列表 <? super Number> 和 Double,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8083204/

相关文章:

java - 如何修复 'android.os.NetworkOnMainThreadException' ?

go - 不属于接口(interface)类型的通用类型

java - 类型参数导致错误

java - 需要解释 : Generic friendliness to avoid casting, 这在 Java 8 中不再需要

c# - 创建不能接收空参数的方法或列表

java - 如何通过TCP/IP以更少的秒数接收base64转换的[音频文件]?

java - 手动编辑 Jar 以更改包名称

Java泛型方法来过滤和查找列表中的第一个元素

java - 在android中获取当前位置一次

java - 如何使用 ENTER 退出循环