【问题标题】:How to reclaim the generic type you declared an arraylist to be in Java?如何回收您在 Java 中声明 arraylist 的泛型类型?
【发布时间】:2011-01-21 04:11:03
【问题描述】:

我只是在玩,突然想到一个想法,我决定尝试一下: 制作一个包含更多 ArrayList 的 ArrayList。

例如,我创建了一个名为 intList 的 ArrayList 来保存整数,然后用值填充它。之后我做了一个 stringList 并填充了它。然后我创建了一个 ArrayList,其中包含其他称为 aList 的 ArrayList,并向其中添加了 intList 和 stringList。

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

这是我试过的代码:

    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);
      }
     }
    } 
}

【问题讨论】:

标签: java generics arraylist


【解决方案1】:

Java 具有“泛型类型擦除”,这意味着泛型的类型参数被“擦除”。一旦创建了ArrayList&lt;T&gt;,就无法知道T 是什么。

【讨论】:

    【解决方案2】:

    只有类类型可以用作泛型类型参数,所以你不能有ArrayList&lt;int&gt;。请改用ArrayList&lt;Integer&gt;

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

    这里更深层次的问题是您仍在使用原始类型,因此编译器无法为您找到该错误。您应该将list 声明为List&lt;List&lt;? extends Object&gt;&gt;。这样您就可以同时添加一个ArrayList&lt;Integer&gt; 和一个ArrayList&lt;String&gt;,并在循环中将值提取为Object 类型。

    【讨论】:

      【解决方案3】:

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

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

      但是:

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

      【讨论】:

        【解决方案4】:

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

        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
        

        【讨论】:

          【解决方案5】:
          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);
                }
               }
              } 
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-10-03
            • 2018-12-14
            • 1970-01-01
            相关资源
            最近更新 更多