![](/img/trans.png)
[英]Returning a specific element from an ArrayList but getting type mismatch error?
[英]Returning an element from an ArrayList of collections, where each collection has a different element type
我有一个不同类型的BagWithRandomSelect
的ArrayList
。 因此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.