wenn du einen Handler<? extends Message>
erzeugst/ irgendwo hast,
dann ist die Art der verarbeiteten Message, T, unbekannt,
-> dann kannst du die handle-Methode schlicht nicht sauber aufrufen,
genau wie bei einer List<? extends Message> kein add() möglich, wohl aber noch get(), man weiß nicht was genau drin ist, aber auf jeden Fall Message-Objekte
sort() geht auch noch, als Grenzfall generisch unsauberer Code aber sicher im Rahmen kann man die enthaltenen Elemente umsortiern
Collections: public static <T extends Comparable<? super T>> void sort(List<T> list)
das Herunterrechnen ist generell auch keine gute Idee:
TestHandler ist ein Handler für TestMessage, nicht für jede Art von Message
würde man ein TestHandler als Handler behandeln und generisch korrekt die Methode handle(Message) nutzen,
dann könnte man auch ein Objekt der Klasse RealMessage übergeben, also != TestMessage,
was würde wohl in TestHandler in der Methode handle(TestMessage) passieren,
mit Aufruf expliziter Methoden dieser TestMessage-Klasse auf ein RealMessage-Objekt?
schon vorher ClassCastException
ich könnte nun auch wieder ein List-Beispiel geben, aber wohl auch so ausreichend
mit dem zweiten Absatz glaube ich inzwischen, dass dein Anlegen-Code doch ganz gut so ist wie er ist,
wie er ist, das ist aber kaum zu erkenne, was ist InjectorFactory.instance().getInjector(), gibt es in Suchmaschinen nicht, ist das dein Code?
welchen Rückgabetyp liefert injector.getInstance(TestHandler.class)
?
falls TestHandler oder zumindest Handler, dann deine Probleme erklärbar und korrekt von dieser Methode
mit einer Methode createHandler(String string)
verläßt du generell jegliche generische Sicherheit,
an dieser Stelle ist unbekannt/ beliebig, was für ein Objekt aus dem String entsteht
den Rückgabetyp musst du dir passend setzen und innerhalb der Methode beliebig mit Casten und anderen Schweinereien das Richtige zurückgeben,
erst danach, ab der Rückgabe, kann wieder eine gewisse Vertrauenskette aus generischer Korrektheit aufgebaut werden
schreibe z.B.
{
Handler<TestMessage> handler = createHandler("Testhandler");
TestMessage t = null;
handler.handle(t);
}
private static <T extends Message> Handler<T> createHandler(String string)
{
return (Handler<T>) .. // irgendwas was hoffentlich am Ende stimmt
}
dann liegt es allein in der Verantwortung des Aufrufers, den “Testhandler” als Handler zu verwenden,
der Aufrufer müsste der Methode auch gar nicht mitteilen, welchen Typ er annimmt, könnte auch erst nach createHandler() alleine casten
eine Sicherheit einzubauen, dass der MessageTyp zum String passt, ist relativ schwierig und immer etwas unsauber
sicherer wäre vielleicht die Richtung
{
Handler<TestMessage> handler = getInstance(TestHandler.class);
TestMessage t = null;
handler.handle(t);
}
private static <T extends Message, U extends Handler<T>>U getInstance(Class<U> cl)
{
return (U)cl.newInstance();
}
(kann Fehler enthalten), aber hier habe ich wohlweislich schon getInstance-Namen verwendet, denn das macht anscheinend diese Methode,
und du willst ja wohl nicht ohne Grund getHandler(String) dabei haben…