如何回收你在Java中声明的arraylist的泛型类型?

时间:2011-01-21 04:11:03

标签: java generics arraylist

我只是在玩耍,想到了我的想法,我决定要尝试一下: 创建一个包含更多ArrayLists的ArrayList。

例如,我创建了一个名为intList的ArrayList,它保存了int,然后用值填充它。之后我做了一个stringList并填充了它。然后我创建了一个ArrayList,它包含名为aList的其他ArrayLists,并将intList和stringList添加到它。

现在我面临的问题是,如果我从aList中检索对象,它将无法识别泛型类型是int还是字符串。

这是我尝试过的代码:

    import java.util.*;

public class Practice {
    public static void main(String[] args) {

List<ArrayList> list = new ArrayList<ArrayList>();

     ArrayList<int> intList = new ArrayList<int>();
     intList.add(1);
     intList.add(2);
     intList.add(3);

     ArrayList<String> stringList = new ArrayList<String>();
     stringList.add("One");
     stringList.add("Two");
     stringList.add("Three");

     list.add(intList);
     list.add(stringList);

     for(ArrayList lst : list) {
      for(ArrayList lt : lst) {
       System.out.println(lt);
      }
     }
    } 
}

5 个答案:

答案 0 :(得分:3)

Java具有“泛型类型擦除”,这意味着泛型的类型参数被“擦除”。创建ArrayList<T>后,无法找到T的内容。

答案 1 :(得分:1)

只有类类型可以用作泛型类型参数,因此您不能拥有ArrayList<int>。请改用ArrayList<Integer>

此外,循环中使用的类型是错误的。由于list是值列表的列表,lst是值列表,这意味着您的lt变量将是整数或字符串,而不是另一个ArrayList }。

这里更深层次的问题是您仍在使用原始类型,因此编译器无法为您找到该错误。您应该将list声明为List<List<? extends Object>>之类的内容。这样,您可以向其中添加ArrayList<Integer>ArrayList<String>,并在循环中将值提取为Object类型。

答案 2 :(得分:0)

由于没有类型信息存储在泛型类型中,您可以从子列表中获取元素并检查它的类型:

for(ArrayList subList : list) {
    if (subList.size() > 0) {
        Class elementClass = subList.get(0).getClass();
        // do something else with it
    }
}

可是:

  1. 如果subList为空,它将无效
  2. 通常,在另一个列表中存储多个不同类型的列表的概念看起来很奇怪。

答案 3 :(得分:0)

类型擦除意味着在运行时,类型被擦除。这就是为什么你可以从一个泛型转换为另一个:

import java.util.ArrayList;

public class Test {
        public static void main(String [] args){
                ArrayList<String> list = new ArrayList<String>();
                ArrayList list2 = (ArrayList)list;
                list2.add(new Integer(5));
                System.out.println(list2.get(0).getClass());
        }
}

将输出:

class java.lang.Integer

答案 4 :(得分:0)

import java.util.*;

public class Practice {
    public static void main(String[] args) {

    List<ArrayList<?>> list = new ArrayList<ArrayList<?>>();

     ArrayList<Integer> intList = new ArrayList<Integer>();
     intList.add(1);
     intList.add(2);
     intList.add(3);

     ArrayList<String> stringList = new ArrayList<String>();
     stringList.add("One");
     stringList.add("Two");
     stringList.add("Three");

     list.add(intList);
     list.add(stringList);

     for(ArrayList<?> lst : list) {
      for(Object lt : lst) {
       System.out.println(lt);
      }
     }
    } 
}