本文介绍了ArrayList <?超级号码&gt;和双的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

通过:
$ b

那么为什么

   Number 或超类型 - 它是一个子类。你可以这样写: 

  //有效的
ArrayList<扩展Number> psupn1 = new ArrayList< Integer>();

...因为这是相反的。在这一点上,你可以写:

  Number x = psupn1.get(0); 

因为列表中的任何元素都保证可以转换 数。这是所有转换所需的 - 泛型类型参数或


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

So why

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

compiled?

Double is not supertype of Number but subclass of Number...

Edit 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??

    }
解决方案

You can add a Double to that, because whatever the type parameter E is, it's guaranteed to be either Number or a supertype... which means you can definitely convert from Double to E. You wouldn't be able to do:

Number x = psupn1.get(0);

though.

Think about it, and try to create lists which would logically break this. For example, you can't use:

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

because Integer isn't either Number or a supertype - it's a subclass. You can write:

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

... because that's the other way round. At that point you can write:

Number x = psupn1.get(0);

because any element in the list is guaranteed to be convertible to Number. It's all about which way the conversions are required - to the generic type parameter or from it.

这篇关于ArrayList <?超级号码&gt;和双的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-21 17:30