Wol*_*0pl 5 java generics list
我有一个Object有时包含一个List<Object>.我想检查它instanceof,如果是,然后添加一些元素.
void add(Object toAdd) {
Object obj = getValue();
if (obj instanceof List<?>) {
List<?> list = obj;
if (list instanceof List<Object>) { // Error
((List<Object>) list).add(toAdd);
} else {
List<Object> newList = new ArrayList<Object>(list);
newList.add(toAdd);
setValue(newList);
}
return;
}
throw new SomeException();
}
Run Code Online (Sandbox Code Playgroud)
它说我无法检查是否是instanceof List<Object>因为java不关心并删除了类型<>.这是否意味着我每次都必须创建新的ArrayList?或者有没有办法检查,例如.用反射?
我之前的回答错了,因为我没有完全理解你的要求。如果你添加的项目是一个对象,你可以毫无问题地添加它,只要你有一个列表。您不必重新创建列表
void add(Object toAdd) {
Object obj = getObject();
if (obj instanceof List<?>) {
((List<Object>)obj).add(toAdd);
return;
}
throw new SomeException();
}
Run Code Online (Sandbox Code Playgroud)
更新
作为对少数评论的回答,将任何对象添加到列表中是没有问题的,并且在它之后的迭代过程中找出它是什么类型的对象也没有问题:
List<String> x1 = new ArrayList<String>();
Object c3 = x1;
x1.add("asdsad");
Integer y2 = new Integer(5);
if (c3 instanceof List<?>){
((List<Object>)c3).add((Object)y2);
}
for (Object i : (List<Object>)c3){
if (i instanceof String){
System.out.println("String: " + (String)i);
}
if (i instanceof Integer){
System.out.println("Integer: "+ (Integer)i);
}
}
Run Code Online (Sandbox Code Playgroud)