迭代Java中任何类型的泛型数组

Wil*_*hoi 6 java generics loops

如果存在可以携带原始类型,通用数组和/或可迭代集合的Java Collection实例,我想将通用数组视为Iterable集合,但是如何?例如以下伪java代码

List<?> list1; 
list1.add(new int[2]); 
list1.add(new String[3]); 
list1.add(new ArrayList());
for (Object e : list1){
    if (e instanceof Iterable){ 
        //The int[2] and String[3] will not fall in this case that I want it be
        //Iterate within e
    }
}
Run Code Online (Sandbox Code Playgroud)

请告知如何使int [2]和String [3]落在案例中.

谢谢和问候,威廉

Pet*_*iuk 9

使用反射包中的Array类:

    final List<Object> list = new ArrayList<Object>();
    list.add(new int[] { 1, 2 });
    list.add(new String[] { "a", "b", "c" });
    final List<String> arrayList = new ArrayList<String>();
    arrayList.add("el1");
    list.add(arrayList);

    for (Object element : list) {
        if (element instanceof Iterable) {
            for (Object objectInIterable : (Iterable) element) {
                System.out.println(objectInIterable);
            }
        }
        if (element.getClass().isArray()) {
            for (int i = 0; i < Array.getLength(element); i++) {
                System.out.println(Array.get(element, i));
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)


Asa*_*aph 4

在循环中,您可以使用适当的数组操作数instanceof

为了int[]

if (e instanceof int[]) {
   // ...
}
Run Code Online (Sandbox Code Playgroud)

对于Object数组(包括String[]):

if (e instanceof Object[]){
    // ...
}
Run Code Online (Sandbox Code Playgroud)

或者,当将数组添加到 master 时List,您可以将每个数组包装在Arrays.asList(). 在这种情况下,您可以使用List<List>泛型而不是通配符泛型List<?>,并避免需要使用 来检查数据类型instanceof。像这样的东西:

List<List> list1; 
list1.add(Arrays.asList(new int[2])); 
list1.add(Arrays.asList(new String[3])); 
list1.add(new ArrayList());
for (List e : list1){
    // no need to check instanceof Iterable because we guarantee it's a List
    for (Object object : e) {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

每当你instanceof同时使用仿制药和仿制药时,都会感觉到你可能用仿制药做了一些不太正确的事情。