2011-10-17 19 views
11

Qual è la differenza tra questi due. Perché quest'ultimo crea una nuova classe serializzabile?Differenza tra ArrayList <>() e ArrayList <>() {}

new ArrayList<Clazz>() 

crea un nuovo vuoto ArrayList

new ArrayList<Clazz>(){} 

Eclipse mostra: The serializable class does not declare a static final serialVersionUID field of type long

risposta

13

Nel primo esempio, si sta creando un'istanza ArrayList. In quest'ultimo si crea istanza di una sottoclasse anonima di ArrayList. Normalmente si dovrebbe sovrascrivere uno o più metodi nella sottoclasse, altrimenti non c'è molto senso nel creare tale. Come sottolinea John Skeet, esiste una ragione per la quale è necessario creare una sottoclasse anonima di un tipo generico, vedere his answer.

The Eclipse avverte che, al fine di aderire alle Serializable specifiche (ArrayList è Serializable, in modo che tutti le sue sottoclassi sono troppo), è necessario definire un unico serialVersionUID nella sottoclasse da cui il processo di deserializzazione può garantire che la definizione della classe non è cambiato in modo significativo da quando è stato serializzato (significativamente == tu stesso hai deciso che la nuova definizione è incompatibile con quella vecchia, quindi puoi esprimere il fatto cambiando il serialVersionUID). Se non pubblichi mai la lista, l'avviso non ha importanza.

+2

Sottoclasse anonima. Perché ero così cieco ... –

7

Come dice Joonas, nel secondo esempio si sta creando una classe interiore anonima. Tuttavia, lo è un motivo per farlo anche quando non si esegue l'override di alcun metodo, ecc .: consente di determinare il tipo di elemento di ArrayList in fase di esecuzione, poiché la superclasse della classe interna anonima è ArrayList<Clazz> anziché solo ArrayList.

Ecco come funzionano i tipi letterali in Guice. È un po 'un brutto trucco, ma ha il compito ...

+0

Come gli permette di determinare il tipo di elemento in fase di runtime? –

+1

@LouisRhys: se chiami 'getClass()' sull'istanza, darà la classe anonima. Se poi chiami 'getGenericSuperclass()' che 'Type' avrà le informazioni appropriate. –

Problemi correlati