Ho codice che ha un Map
di gestori (messaggi). Sto cercando di far generare i gestori (come visto dall'interfaccia Handler). Senza generici i gestori hanno tutti bisogno di lanciare da Object alla rispettiva classe, il che sarebbe bello da evitare (ma tutto funziona). Per ogni classe di messaggio (Foo
di seguito) ho una classe di gestori.Generici Java: l'acquisizione non può essere applicata all'oggetto
Come posso mantenere una mappa di qualsiasi tipo di classe per qualsiasi tipo di gestore e ottenere/chiamare con "solo" un Object
? (il parametro su handleMessage(Object)
non può essere limitato)
Vedere MWE di seguito.
import java.util.*;
public class Logic
{
Map<Class<?>, Handler<?>> handlers = new HashMap<Class<?>, Handler<?>>();
public void run()
{
handlers.put(Foo.class, new FooHandler());
}
public void handleMessage(Object msg)
{
Handler<?> handler = handlers.get(msg.getClass());
if (handler != null) {
handler.execute(msg);
}
}
private interface Handler<T>
{
public void execute(T msg);
}
private class FooHandler implements Handler<Foo>
{
public void execute(Foo msg) {}
}
private class Foo {}
}
Questo codice produce:
Logic.java:16: execute (cattura # x di?) In Logic.Handler non può essere applicato> a (java.lang.Object) gestore. eseguire (msg);
Come può essere riparato per funzionare mantenendo l'interfaccia Handler generica?
La tua risposta mi ha portato a digitare contenitori eterogenei sicuri, relazioni per tipi di generici e quant'altro! Sono un po 'deluso dal fatto che sia impossibile senza i metodi wrapper e @SuppressWarnings comunque: <. Tuttavia, funziona ora, ma non so se valga la pena di introdurre qui i farmaci generici. –
Il problema è quanto complicato sia la sintassi generica. ;) Controlla le chiamate ad addHandler, hetHandler e getHandlerFor sono corretti. –