将数据添加到java中的泛型集合中

时间:2015-04-19 13:09:22

标签: java generics

有没有办法可以用Java在通用集合中添加数据。 例如: -

import java.util.List;
import java.util.Vector;

public class testGenerics {
    public static void main(String args[]) {    
        Vector<? extends Number> superNumberList = null;

        // I can do this
        Vector<Integer> subList = new Vector<Integer>();
        subList.add(2);
        superNumberList = subList;

        // But i cannot do this
        // Gives the below compilation error.
        //The method add(capture#2-of ? extends Number) in the type 
        //Vector<capture#2-of ? extends Number> is not applicable for the arguments (Integer)        
        superNumberList = new Vector<Integer>();
        superNumberList.add(new Integer(4));

        superNumberList = new Vector<Float>();
        superNumberList.add(new Float(4));
    }

}

正如我在评论中提到的,当我尝试将一个Integer或Float数据添加到superNumberList时,我有编译错误。

我能够做到这一点,第一种方式,但是我想第二种方式,并且不确定为什么Java不允许我以第二种方式进行。

我有一个西装,我有一个超类,它有这个superNumberList,所有子类都试图使用这个相同的变量,但在这个集合中有不同的数据类型,如Integer,Float等。

2 个答案:

答案 0 :(得分:3)

Vector<? extends Number>是未知数字类型的向量。因此,您无法将任何内容添加到其中。

可能是Vector<Float>。因此,您无法添加Integer

但它也可能是Vector<Integer>。因此,您无法添加Float

你唯一知道的是,无论你拉出 out ,我都会Number


如果您的超类具有IntegerFloat等的子类,那么您应该使超类具有通用性:

class SuperClassWithVector<T extends Number>{
    protected Vector<T> myVector;
}

class FloatSubClass extends SuperClassWithVector<Float>{
   // here myVector takes Float
}

如果您想要Vector可以同时使用IntegerFloat(不确定这是否是您想要的),那么您可以使用Vector<Number>

答案 1 :(得分:0)

您不需要使用? extends Number

Vector<Number> superNumberList = null;
...
superNumberList = new Vector<Number>();
superNumberList.add(new Integer(4));
superNumberList.add(new Float(4));