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

具有不同类型的Java通用对象。,java,generics,Java,Generics,想象一下,有两个通用数组列表,每个列表存储不同的类型。我的程序一次只使用其中一个ArrayList。是否可以创建一个可以存储两个ArrayList的常规ArrayList(currentArrayList),并在不强制转换的情况下使用这两个ArrayList ArrayList<Integer> arrInt = new ArrayList<>(); arrInt.add(10); ArrayList<String> arrString = new Array

想象一下,有两个通用数组列表,每个列表存储不同的类型。我的程序一次只使用其中一个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);
ArrayList arrInt=new ArrayList();
加上(10);
ArrayList arrString=新的ArrayList();
添加(“十”);
ArrayList currentArrayList=arrInt;
整数i=currentArrayList.get(0);
currentArrayList=arrString;
String str=currentArrayList.get(0);

谢谢。

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

ArrayList<ArrayList<Object>> array = new ArrayList<ArrayList<Object>>();
array.add(new ArrayList<Integer>());
array.add(new ArrayList<String>());
ArrayList数组=新的ArrayList();
add(新的ArrayList());
add(新的ArrayList());

这应该可以做到,因为所有其他可能的对象都将从中的对象继承,因此将被接受。

问题在于您希望:

使用两个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);
绝对不会发生。静态类型系统的全部目的是阻止您在不明确要求的情况下将常规类型视为特定类型

例如,你可以说:

ArrayList<?> currentArrayList = arrInt;
Object i = currentArrayList.get(0);
如果没有演员阵容,第二行是永远不会发生的

更新评论中的问题:


编译器不能很容易地推断ArrayList的类型吗 查看arrInt的泛型类型

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

currentArrayList = arrString;

目前的代码假定编译器不会进行这种推理。假设你把第二个作业注释掉。现在,编译器可以进行您建议的推理,并允许您的代码进行编译。但是在将来,如果你把第二个任务放回去,剩下的代码就会停止编译!这会造成不必要的混乱。

最终您必须确定对象的类型

我猜你想避免“超级警告”(铸造)之类的警告

如果是真的,那么它是这样的:

  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);
  }
ArrayList list=new ArrayList();
增加第(1)款;
列表。添加(“abc”);
增加(新双(3.1415926));
list.add(true);
用于(对象o:列表){
//或者更准确
字符串类型;
if(o整数的实例){
type=“int”;
//逻辑在这里。。。
int i=(整数)o;//无强制转换警告
}else if(o字符串实例){
type=“string”;
//逻辑在这里。。。
}
//如果你愿意,还有其他的可能性
else{//无与伦比
type=o.getClass().getSimpleName();
}
System.out.println(type+“:”+o);
}

只需使用
ArrayList
;不是泛型。@Azodious如果不使用强制转换,该如何工作?我不知道如何在从列表中获取字符串和整数后不必强制转换它们就可以做到这一点。是的,如果不使用泛型类型,则需要强制转换。我想实现与上述场景类似的功能,因为我正在创建一个应用程序和用户轮流执行的程序(对话)应用程序有一个需要遵循的脚本,我需要跟踪应用程序的最新位置。我不认为他想要列表。编译器不是很容易通过查看arrInt的泛型类型推断ArrayList的类型吗?