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);
}
+1 Esattamente, quindi l'interfaccia consente 'put (Number.class, num)' o 'put (Integer.class, num)' come appropriato. –
'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