Path: csiph.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: "Christian H. Kuhn" Newsgroups: de.comp.lang.java Subject: Re: Generics und Wildcards Date: Wed, 21 Aug 2019 21:17:07 +0200 Lines: 65 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: individual.net z8UNaahfr3ZZ4RLFYzfDIQXMOpLFhv56YOm0k+q+gWAKeW9Qg= Cancel-Lock: sha1:CqVH4Yck+22l41LCthgqrZucUMk= User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 In-Reply-To: Xref: csiph.com de.comp.lang.java:13270 Am 21.08.2019 um 19:42 schrieb Patrick Roemer: > Responding to Christian H. Kuhn: > >> Als wird LSElement in LSNote> verpackt. > > Ich verstehe schon nicht, warum hier zwingend ein Wildcard ins Spiel > kommen soll... Was wäre denn die Alternative? > Versuch mal, das Problem auf ein minimales, zusammenhängendes > Codebeispiel zu reduzieren, das die Implementierung möglichst weglässt > und sich nur auf die API und die Aufrufe konzentriert. > public interface LSElement { List findLegalMoves(); LSElement executeMove(T move); } public class LSNode> { private E element; public LSNode(final E element) { this.element = element; } public E getElement() { return this.element; } } public class LSGraph> { public void findShortestPath(final E startNode, final E destNode){ List moves = startNode.getElement().findLegalMoves(); fspHelper(moves, startNode); } private fspHelper(final List moves, final E startNode) { for (final M move : moves) { // Hier ist das Problem: executeMove mag nicht mit M. LSNode newNode = new LSNode(startNode.getElement().executeMove(move)); } } } Das müsste bis auf den einen Fehler kompilierbar sein, nichts überflüssiges enthalten, und alles, was noch dazukommt, macht erst später Probleme ;-) Man sollte öfter Auto fahren, das macht den Kopf frei. Die Generics sollen sicherstellen, dass auf einem implementierten LSElement nur Züge vom richtigen Typ ausgeführt werden können. Das geht auch mit Object, Cast und Check. Und dass im LSGraph alle LSNodes den gleichen Typ LSElement beinhalten. Der Client übergibt Start- und Zielnode, das lässt sich checken, ob die vom gleichen Typ sind. Alle anderen LSElement werden von einer Methode des jeweiligen Typs geliefert; wenn die den falschen Typ haben, war halt der Programmierer ein Idiot. Und auch das ließe sich checken, das geht mir dann aber langsam zu sehr auf die Performance. Und schließlich muss ich noch mit defensive copies dafür sorgen, dass mir da kein LSNode oder LSElement nach den Checks unter der Hand ausgetauscht wird. Dann habe ich alles, was ich benötige, und das einzige, was fehlt, ist der Lerneffekt ;-) TIA QNo