Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查对象是否为列表的实例<;对象>;_Java_List_Generics - Fatal编程技术网

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您的编辑仍然是错误的。
列表
不一定是
列表