2013-08-07 12 views
5

Sto verificando il modello di contenitore eterogeneo da Effective Java di Bloch e sto cercando di determinare il motivo per cui il riferimento di classe è necessario quando si inseriscono oggetti nel contenitore eterogeneo. Non posso usare instance.getClass() per ottenere questo riferimento? Un esempio di questo non è l'entity manager di JPA?Quando si inseriscono oggetti in un contenitore eterogeneo sicuro per il tipo, perché è necessario il riferimento alla classe?

interface BlochsHeterogeneousContainer { 

    <T> void put(Class<T> clazz, T instance); 

    <T> T get(Class<T> clazz); 
} 

interface AlternativeHeterogeneousContainer { 

    // Class<T> not needed because we can use instance.getClass() 
    <T> void put(T instance); 

    <T> T get(Class<T> clazz); 
} 

risposta

5

No, non è possibile farlo, in quanto non vi darà classe di tipo di riferimento in caso di successione, piuttosto la classe di tipo di oggetto reale.

Considerate questo esempio:

Number num = new Integer(4); 
System.out.println(num.getClass()); 

questo stampa:

class java.lang.Integer 

e non java.lang.Number.

+0

+1 Esattamente, quindi l'interfaccia consente 'put (Number.class, num)' o 'put (Integer.class, num)' come appropriato. –

+0

'put (Integer.class, num)' genererebbe un errore del compilatore. Questo ha senso perché i tipi degli argomenti sono (Classe , Numero). Non è possibile impostare T su Numero intero perché Numero non è un numero intero. Non è possibile impostare T per il numero perché la classe non è una classe . Tuttavia, è comunque utile avere un parametro di tipo dato che puoi fare cose come 'put (Object.class, num)'. In questo caso, T è impostato su Oggetto (e tutti i numeri sono oggetti, quindi funziona). – Cod3Citrus

Problemi correlati