从集合的ArrayList返回元素,其中每个集合具有不同的元素类型

时间:2016-03-06 07:21:09

标签: java generics arraylist collections

我有ArrayList个不同类型的BagWithRandomSelect。因此arrayList.get(1)可以返回BagWithRandomSelect<Integer>个对象,而arrayList.get(2)可以返回BagWithRandomSelect<String>个对象。是否可以编写一个方法来将BagWithRandomSelect中的元素作为自己的类型返回,而不是返回需要强制转换的Object

我的问题在于方法testGetFromColumn()

public class BagWithRandomSelect<E> {
    ArrayList<E> bag;
    public BagWithRandomSelect() {
        this.bag = new ArrayList<>();
    }
    public void add(E element) {
        this.bag.add(element);
    }
    public E randomSelect() {
        Random rnd = new Random();
        int rndInt = this.rnd.nextInt(bag.size);
        return this.bag.get(rndInt);
    }
}

public class DatafileCreator {
    ArrayList<BagWithRandomSelect> columnList;
    public DatafileCreator() {
        this.columnList = new ArrayList<Stack>();
    }

    // skipping some methods...

    public void addNewColumn(BagWithRandomSelect bag, String s) {
        this.columnList.add(bag);
    }

    public Object testGetFromColumn(int columnNum) {
        BagWithRandomSelect<Object> bag = this.columnList.get(columnNum);
        return bag.randomSelect();
    }
}

1 个答案:

答案 0 :(得分:0)

是的,但是你必须知道期望的对象类型。但是,由于在使用Object时必须进行强制转换,这应该不是问题。

public <T> T testGetFromColumn(int index, Class<T> clazz) {
    BagWithRandomSelect<?> bag = columnList.get(index);
    return clazz.cast(bag.randomSelect());
}

请注意,您必须在此处使用Class对象进行此显式转换 - 由于类型擦除将return (T) item;转换为return (Object) item;,正常转换将不会检查转换是否在运行时有效}。你可以得到真正令人讨厌的错误,例如。ClassCastExceptions,但代码中没有强制转换。

然后您可以使用以下方法:

DatafileCreator creator = ...;
...
String s = creator.testGetFromColumn(5, String.class);
Integer i = creator.testGetFromColumn(3, Integer.class);