繁体   English   中英

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

[英]Returning an element from an ArrayList of collections, where each collection has a different element type

我有一个不同类型的BagWithRandomSelectArrayList 因此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();
    }
}

是的,这是可能的,但是您必须知道期望的对象类型。 但是由于在使用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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM