2013-02-03 8 views
5

Ho uno Object che a volte contiene uno List<Object>. Voglio verificarlo con instanceof, e se lo è, quindi aggiungere alcuni elementi ad esso.Verifica se Object è l'istanza di Elenco <Object>

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

E dice che non posso controllare se è instanceof List<Object> perché Java non si cura e cancellato il tipo di <>. Ciò significa che devo creare ogni volta un nuovo ArrayList? O c'è un modo per controllarlo, ad es. con la riflessione?

+2

Che diavolo è questo pezzo di codice dovrebbe fare? – poitroae

+2

È noto come cancellazione dei tipi in Java http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens –

+0

@ Michael questo sarà un wrapper attorno a snakeyaml. Se ho una lista in yaml, la analizzerò in qualche lista in Java. Se voglio aggiungere un elemento a questa lista, ho bisogno di sapere che tipo di lista è. Ecco perché creo una nuova ArrayList di tipo noto e aggiungo tutti i vecchi elementi, più una nuova. Quindi sostituisco la vecchia lista con quella nuova, e quando chiamo snakeyaml per riconvertirla in yaml, il mio elemento aggiunto sarà lì. – Wolf480pl

risposta

3

Ho sbagliato nella mia risposta precedente poiché non ho compreso appieno le vostre esigenze. se il tuo oggetto aggiunto è un oggetto puoi aggiungerlo senza problemi purché tu abbia una lista di qualcosa. Non è necessario ricreare l'elenco

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

UPDATE

come risposta a qualche commento, non c'è nessun problema di aggiungere qualsiasi oggetto a un elenco, e non c'è nessun problema di scoprire che tipo di oggetto è durante iterazione dopo di esso:

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); 
    } 
} 
+0

Voglio assicurarmi che il parametro non sia una sottoclasse di Object. GetActualTypeArguments() == Object.class funzionerà? – Wolf480pl

+0

Inoltre, sarà più veloce della copia di <50 elementi ArrayList? – Wolf480pl

+1

Questo è completamente sbagliato. Questo avviene solo se la classe dell'oggetto è una sottoclasse di ArrayList o qualcosa del genere e che la estende con un parametro di tipo specifico. Nessuno dei quali è ciò che l'OP sta facendo. – newacct

Problemi correlati