我有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();
}
}
答案 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);