Mam kod, który ma Map
z (wiadomości) Handler. Próbuję zrobić generatory obsługi (jak widać przez interfejs Handler). Bez leków generycznych wszyscy opiekunowie muszą rzucać z Obiektu do odpowiedniej klasy, co byłoby fajnie uniknąć (ale wszystko działa). Dla każdej klasy wiadomości (Foo
poniżej) Mam klasy obsługi.Generics Java: przechwytywanie nie może być zastosowane do Object
Jak mogę zachować mapę dowolnego rodzaju Klasy w jakimkolwiek rodzaju Handlerów i uzyskać/zadzwonić z "po prostu" Object
? (nie można ograniczyć parametru do handleMessage(Object)
)
Zobacz poniżej MWE.
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 {}
}
Ten kod daje:
Logic.java:16: execute (capture # x z?) W Logic.Handler nie może być stosowany> do (java.lang.Object) obsługi. execute (msg);
Jak można to naprawić, aby działało, zachowując jednocześnie ogólny interfejs programu obsługi?
Twoja odpowiedź doprowadziła mnie do wpisania bezpiecznych heterogenicznych pojemników, relacji dla typów generycznych i innych! Jestem trochę zawiedziony, że nie da się tego obejść bez owijki i @SuppressWarnings: <. Mimo to działa teraz, ale nie wiem, czy to jest warte kłopotu z wprowadzeniem tutaj generycznych. –
Problem w tym, jak skomplikowana jest składnia generyczna. ;) Sprawdza, czy wywołania addHandler, hetHandler i getHandlerFor są poprawne. –