Java 检查对象是否为列表的实例<;对象>;
我有一个Java 检查对象是否为列表的实例<;对象>;,java,list,generics,Java,List,Generics,我有一个对象,它有时包含一个列表。我想用instanceof检查它,如果是,则向它添加一些元素 void add(Object toAdd) { Object obj = getValue(); if (obj instanceof List<?>) { List<?> list = obj; if (list instanceof List<Object>) { // Error
对象
,它有时包含一个列表
。我想用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();
}
void添加(要添加的对象){
Object obj=getValue();
if(obj实例列表){
列表=obj;
if(list instanceof list){//错误
((列表)列表)。添加(toAdd);
}否则{
List newList=新阵列列表(List);
newList.add(toAdd);
设置值(新列表);
}
返回;
}
抛出新的SomeException();
}
它说我不能检查它是否是列表的实例,因为java不关心并删除了
中的类型。
这是否意味着我每次都必须创建新的ArrayList?或者有没有办法检查一下,例如通过反思?我之前的回答是错误的,因为我没有完全理解您的要求。
如果您添加的项目是一个对象,只要您有一个列表,您就可以毫无问题地添加它。
您不必重新创建列表
void add(Object toAdd) {
Object obj = getObject();
if (obj instanceof List<?>) {
((List<Object>)obj).add(toAdd);
return;
}
throw new SomeException();
}
void添加(要添加的对象){
Object obj=getObject();
if(obj实例列表){
((列表)对象)。添加(toAdd);
返回;
}
抛出新的SomeException();
}
更新
作为对一些注释的回答,将任何对象添加到列表中都没有问题,并且在之后的迭代中找出它是什么类型的对象也没有问题:
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);
}
}
List x1=new ArrayList();
对象c3=x1;
x1.添加(“asdsad”);
整数y2=新的整数(5);
if(c3实例列表){
((列表)c3)。添加((对象)y2);
}
(对象一:(列表)c3){
if(字符串的i实例){
System.out.println(“字符串:”+(字符串)i);
}
if(i整数实例){
System.out.println(“整数:”+(整数)i);
}
}
这段代码到底应该做什么?它在Java@Michael中被称为类型擦除,这将是snakeyaml的包装。如果我在yaml中有一个列表,它将把它解析为Java中的某个列表。如果我想向这个列表中添加一个元素,我需要知道它是什么类型的列表。这就是为什么我创建了一个已知类型的新ArrayList,并向其中添加所有旧元素,再加上一个新元素。然后我用新列表替换旧列表,当我调用snakeyaml将其转换回yaml时,我添加的元素将在那里。@Wolf480pl:“如果我想向该列表添加元素,我需要知道它是什么类型的列表。”不,你不需要。snakeyaml如何“知道它是什么类型的列表”?只要snakeyaml不在乎你在里面放了什么,这没关系。@newacct Lol,我刚刚注意到我可以将列表强制转换为任何列表并添加到其中,它不会抛出任何东西。我想确保参数不是Object的子类。getActualTypeArguments()==Object.class是否有效?此外,这会比复制一个文件快吗?这是完全错误的。这仅适用于对象的类是ArrayList或其他东西的子类,并且使用特定类型参数对其进行扩展的情况。这些都不是OP正在做的。@newacct,你是对的,答案已经编辑好了,答案是在问题被编辑和解释得更清楚之前写的,关于ArrayList的子类,你也是对的,我的错误,因为我时间不够。尽管通过反射和参数化类型了解包含对象的类型的提示很有价值。-1您的编辑仍然是错误的。列表
不一定是列表
。