Il problema: Ho una funzione di interfaccia oggetto definito in una classe:Generics: come applicare restrizioni tra chiavi e valori in una mappa
public static interface FunctionObject<T> {
void process(T object);
}
ho bisogno generico perché mi piacerebbe usare T metodi nelle implementazioni del processo.
Poi, in altre classe generica, ho una mappa dove ho classi come chiavi e oggetti funzione come valori:
Map<Class<T>, FunctionObject<T>> map;
ma voglio anche la mappa di accettare le classi sottotipo e oggetti funzione di supertipi DEL Tipo chiave, così ho fatto questo:
Map<Class<? extends T>, FunctionObject<? super T>> map; //not what I need
l'idea di base è quella di essere in grado di utilizzare la mappa come segue:
//if T were Number, this should be legal
map.put(Class<Integer>, new FunctionObject<Integer>(){...});
map.put(Class<Float>, new FunctionObject<Number>(){...});
map.put(Class<Double>, new FunctionObject<Object>(){...});
come voglio rispettare la FunctionObject ha il tipo di chiave classe o un supertipo, quello che mi piacerebbe davvero definire è questo:
Map<Class<E extends T>, FunctionObject<? super E>>> map;
Come posso ottenere l'effetto desiderato? Un contenitore eterogeneo tipicamente è l'unica opzione? Come apparirebbero i tipi generici di Map per consentirne il popolamento da un riferimento?
Potrebbe funzionare in base al caso d'uso. –
Sì, ma implementare l'acquisizione è quando inizia il divertimento XD. –
'get()' può sempre restituire 'FunctionObject