我有一个接受对象的方法。对象是一个列表。该列表可以是任何类型。我想使用反射识别列表的类型并创建列表的实例并对其进行迭代并打印结果。
不同类型的列表
List<Customer> customerList = new ArrayList<Customer>();
List<Service> serviceList = new ArrayList<Service>();
List<Product> productList = new ArrayList<Product>();
接受列表的方法
public void printList(Object genericList){
// identify the type of list
// create the list object
// iterate over the list and print the values
}
最佳答案
由于 type erasure ,没有办法在运行时告诉集合的泛型类型(这偶然使 Object genericList
矛盾)。但是,如果您只想将它们打印出来而不考虑类型,则可以将其转换为 List<?>
:
public void printList(Object obj){
for (Object o : (List<?>)obj) {
System.out.println(o.toString());
}
}
如果您需要更多类型特定的实现,并且您知道列表不会为空,并且您确信列表类型之间没有重叠(即
customerList
不能包含 Product
s,反之亦然),那么您可以在技术上做这样的事情:public void printList(Object obj){
List<?> list = (List<?>)obj;
Object firstElement = list.get(0);
if (firstElement instanceof Customer) {
printCustomers((List<Customer>)list);
} else if (firstElement instanceof Product) {
printProducts((List<Product>)list);
} //...
}
请注意,编译器会提示这些强制转换,这是有充分理由的。它无法知道您是否说的是泛型类型的真相,至少在您尝试从列表中读取值之前不会知道,此时如果您犯了错误,您将获得
ClassCastException
。关于java - 使用反射创建 ArrayList 的实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34737332/