0

想象一下有 2 个通用 ArrayList,每个都存储不同的类型。我的程序一次将只使用其中一个 ArrayList。是否可以创建一个可以存储两个 ArrayList 的通用 ArrayList(currentArrayList),并使用两个 ArrayList 而无需强制转换。

ArrayList<Integer> arrInt = new ArrayList<>();
arrInt.add(10);
ArrayList<String> arrString = new ArrayList<>();
arrString.add("ten");

ArrayList<XXX> currentArrayList = arrInt;
Integer i = currentArrayList.get(0);

currentArrayList = arrString;
String str = currentArrayList.get(0);

谢谢。

4

3 回答 3

1

问题是您想要的部分:

使用两个 ArrayList 而不进行强制转换。

绝对不会发生。静态类型系统的全部意义在于阻止您在没有明确要求的情况下将通用类型视为特定类型。

例如,你可以说:

ArrayList<?> currentArrayList = arrInt;
Object i = currentArrayList.get(0);

但请注意,这i只是一个Object,所以编译器很高兴 - 我们对数组中的东西一无所知,除了它们必须是 -Object因为这是一个 Java 程序。但是你想说:

ArrayList<?> currentArrayList = arrInt;
Integer i = currentArrayList.get(0);

如果没有演员阵容,第二条线永远不会发生。

更新评论中的问题:

编译器不能通过查看 arrInt 的泛型类型轻松推断 ArrayList 的类型吗?

假设它为我们做到了。currentArrayList当它看到该行时,它应该如何处理类型:

currentArrayList = arrString;

您的代码假设编译器不会进行这种推断。假设您注释掉第二个作业。现在编译器可以做出你建议的推断,并允许你的代码编译。但是将来如果您放回第二个作业,其余代码将停止编译!这会造成不必要的混乱。

于 2012-10-19T09:08:03.980 回答
1

无论如何,您最终必须确定对象的类型。

我猜你想避免“supresswarning(“casting”)”类型的警告?

如果是的话,这里是:

  ArrayList<Object> list = new ArrayList<Object>();
  list.add(1);
  list.add("abc");
  list.add(new Double(3.1415926));
  list.add(true);

  for (Object o : list) {
     // or more accurate
     String type;
     if (o instanceof Integer) {
        type = "int";
        // logic here...
        int i = (Integer) o; // no casting warning
     } else if (o instanceof String) {
        type = "string";
        // logic here...
     }
     // other possibilities if you want
     else { // unmatched
        type = o.getClass().getSimpleName();
     }
     System.out.println(type + ": " + o);
  }
于 2012-10-19T09:17:28.920 回答
0

误解了这个问题——你到底为什么要这样做?您不是在创建一个新的 ArrayList,您只是在使用没有类型的指针 - 它仍然是相同的 ArrayList!

ArrayList<ArrayList<Object>> array = new ArrayList<ArrayList<Object>>();
array.add(new ArrayList<Integer>());
array.add(new ArrayList<String>());

这应该可以解决问题,因为所有其他可能的对象都将从 Object 继承,因此被接受。

于 2012-10-19T09:05:32.963 回答