Domanda

Voglio fare una mappa-tipo di contenitore che ha la seguente interfaccia:

public <T> Thing<T> get(Class<T> clazz);
public <T> void put(Class<T> clazz, Thing<T> thing);

Il punto interessante è che le Ts in ogni Class<T> -> coppia Thing<T> è la stessa T, ma il contenitore dovrebbe essere in grado di contenere molti tipi differenti di coppie. Inizialmente ho provato un (Hash) Mappa . Ma, per esempio,

Map<Class<T>, Thing<T>>

non è giusto, perché allora T sarebbe la stessa T per tutti coppie in quella mappa. Naturalmente,

Map<Class<?>, Thing<?>>

opere, ma poi non ho garanzie di tipo di sicurezza in modo che quando ho get(String.class), non posso essere sicuro che ricevo un back esempio Thing<String>.

C'è un modo ovvio per realizzare il tipo di sicurezza di tipo che sto cercando?

È stato utile?

Soluzione

La mappa in sé non garantirebbe che, ma se si accede solo attraverso i metodi di cui sopra, si avrà la sicurezza desiderato.

Altri suggerimenti

Se si vuole essere in grado di mettere i diversi tipi non dovreste dichiarare due parametri di tipo?

public <K, V> Thing<V> get(Class<K> clazz);
public <K, V> void put(Class<K> clazz, Thing<V> thing);

o ho fatto fraintendere la domanda?

Edit: vedo, bene se si vuole o contenitore che può contenere entità di tipo diverso, non c'è modo si può avere la sicurezza di tipo completo, dal momento che quando si dichiara il vostro contenitore si può solo mettere un tipo sul contenitore e poi si può essere in grado di mettere gli oggetti, ma non puoi essere sicuro di quello che si ottiene indietro. Nella migliore delle ipotesi si finirà per mettere in oggetti come oggetto, e poi facendo instanceof e calchi quando li ottenete indietro. Tutte le collezioni hanno questo problema. Immaginate di avere una Collection<T extends Thing>. Si può mettere in esso cose, ChildOfThings o GrandChildOfThings, ma quando si arriva di nuovo, sei unica garanzia è che si tratta di una cosa, non si può dire se si tratta di un figlio o nipote, senza realmente testarlo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top