问题描述
通过:
$ 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 <?超级号码>和双的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!