Java generics: capture kann nicht angewendet werden, - Objekt

Ich habe code, der eine Map von (Message)Handler. Ich bin versucht zu machen, den Handler generified (wie gesehen, durch die interface-Prozedur). Ohne Generika Handler, die alle brauchen, um zu Gießen aus dem Objekt der jeweiligen Klasse, das wäre schön, zu vermeiden (aber alles funktioniert). Für jede Nachrichtenklasse (Foo unten) ich habe eine handler-Klasse.

Wie kann ich eine Karte von jeder Art von Klasse, um jede Art von Handler und Holen/rufen Sie "nur" mit einem Object? (die parameter handleMessage(Object) können nicht eingeschränkt werden)

Sehen MWE unten.

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 {}
}

Dieser code erzeugt:

Logik.java:16: execute(capture#x ?) in der Logik.Handler kann nicht angewendet werden, > to (java.lang.Objekt)
handler.ausführen(msg);

Wie kann das repariert werden, zu arbeiten, während immer noch halten die Handler-Schnittstelle generischen?

InformationsquelleAutor Jonas WS | 2011-11-29
Schreibe einen Kommentar