具有不同类型的Java通用对象。

时间:2012-10-19 09:03:57

标签: java generics

想象一下,每个存储不同类型的2个通用ArrayLists。我的程序一次只能使用其中一个ArrayLists。是否可以创建一个通用的ArrayList(currentArrayList),它可以存储两个ArrayLists,并在不进行转换的情况下使用这两个ArrayLists。

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

感谢。

3 个答案:

答案 0 :(得分:1)

问题是您想要的部分:

  

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

绝对不会发生。静态类型系统的重点是阻止您将一般类型视为特定类型而不明确要求这样做。

例如,您可以说:

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

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

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

这是没有演员阵容的第二行。

更新评论中的问题:

  

编译器不能轻易推断出ArrayList的类型   看一下arrInt的泛型类型?

假设它为我们做了。当currentArrayList看到该行时,它应该怎么做{<1}}:

currentArrayList = arrString;

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

答案 1 :(得分:1)

最终你必须确定对象的类型。

我想你想避免“supresswarning(”cast“)”那种警告?

如果真的,请点击这里:

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

答案 2 :(得分:0)

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

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

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