Tengo una Object que a veces contiene una List<Object>. Quiero comprobar con instanceof, y si es así, a continuación, agregar algunos elementos a la misma.

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

Y me dice que no puedo comprobar si es instanceof List<Object> porque java no cuida y borran el tipo en <>.
¿Esto significa que tengo para crear nuevos ArrayList en cada momento? O hay una forma de comprobar que, por ejemplo. con la reflexión?

¿Qué diablos es este fragmento de código que se supone que debe hacer?
Es conocido como el Tipo de borrado en Java stackoverflow.com/questions/339699/…
este va a ser un contenedor de snakeyaml. Si tengo una lista en yaml, se va a analizar a algunos de la lista en Java. Si quiero añadir un elemento a la lista, necesito saber qué tipo de lista que es. Por eso hago un nuevo ArrayList de tipo conocido y añadir todos los elementos antiguos, además de uno nuevo. Entonces puedo reemplazar la lista anterior con el nuevo, y cuando me llaman snakeyaml para volver a convertirlo en yaml, mi elemento añadido estará allí.
Quiero añadir un elemento a la lista, necesito saber qué tipo de lista que es.» Tú No. ¿Cómo snakeyaml «saber qué tipo de lista es»? Mientras snakeyaml no le importa lo que usted pone en, no importa.
Lol, acabo de notar que me puede echar una lista para cualquier Lista de<Cualquier> y agregar a ella y no tirar nada.

OriginalEl autor Wolf480pl | 2013-02-03

1 Comentario

  1. 3

    Me fue mal en mi anterior respuesta, ya que yo no se entiende completamente sus necesidades.
    si el elemento es un Objeto que se puede añadir sin ningún problema, siempre y cuando usted Tiene una lista de algo.
    Usted no tiene que volver a crear la lista de

    void add(Object toAdd) {
        Object obj = getObject();
        if (obj instanceof List<?>) {
            ((List<Object>)obj).add(toAdd);
            return;
        }
        throw new SomeException();
    }

    ACTUALIZACIÓN

    como respuesta a algunos comentarios, no hay ningún problema para añadir cualquier objeto a una lista, y no hay ningún problema para averiguar qué tipo de objeto es durante la iteración después de ella:

    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);
        }
    }
    Quiero para asegurarse de que el parámetro no es una subclase de Object. Se getActualTypeArguments() == Object.class trabajo?
    También, se que esto va a ser más rápido que la copia de un <50 elementos del ArrayList?
    Esto es completamente erróneo. Esto es sólo si el objeto de la clase es una subclase de ArrayList o algo, y que se extiende con un tipo específico de parámetros. Ninguno de los cuales es lo que el OP está haciendo.
    está a la derecha y la respuesta ha sido editada, la respuesta fue escrito antes de que la pregunta ha sido editado y explicó más claramente, en lo que respecta a la subclase de ArrayList, también a la derecha, mi error, como he tenido tiempo de escasez. Aunque la pista para conocer el tipo de objeto contenido a través de la reflexión y ParameterizedType es valioso.
    -1 la edición sigue siendo incorrecto. Un List<?> es no necesariamente un List<Object>.

    OriginalEl autor Michael

Dejar respuesta

Please enter your comment!
Please enter your name here