Path: csiph.com!news.dns-netz.com!news.freedyn.net!newsreader4.netcologne.de!news.netcologne.de!.POSTED.2001-4dd3-53f0-0-3df8-a3f0-c6f1-30d6.ipv6dyn.netcologne.de!not-for-mail From: Patrick Roemer Newsgroups: de.comp.lang.java Subject: Re: Generics und Wildcards Date: Thu, 22 Aug 2019 12:04:25 +0200 Organization: news.netcologne.de Distribution: world Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Injection-Date: Thu, 22 Aug 2019 10:04:25 -0000 (UTC) Injection-Info: newsreader4.netcologne.de; posting-host="2001-4dd3-53f0-0-3df8-a3f0-c6f1-30d6.ipv6dyn.netcologne.de:2001:4dd3:53f0:0:3df8:a3f0:c6f1:30d6"; logging-data="13417"; mail-complaints-to="abuse@netcologne.de" User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.24) Gecko/20100411 Thunderbird/2.0.0.24 Mnenhy/0.7.6.0 In-Reply-To: Content-Language: en-US Xref: csiph.com de.comp.lang.java:13271 Responding to Christian H. Kuhn: > 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)); > } > } > } Ich bin mir immer noch nicht sicher, ob ich Dein Problem verstehe... Warum willst Du überhaupt den Parameter von LSElement verstecken? Der gehört zur API. Generics/Wildcards sind IMHO kein Mechanismus zum information hiding. Wenn Du mit Gewalt versuchst, die Typinformation "für den Transport" zu obskurieren, wirst Du am Ziel natürlich Probleme haben, ohne die verlorene Information klarzukommen. Weiter sehe nicht, warum LSNode öffentlich sichtbar sein sollte - Deiner Beschreibung nach ist das ein internes Detail der Dijkstra-Implementierung. Naiv fände ich sowas erst mal halbwegs akzeptabel: public static class LSGraph { public void findShortestPath( final LSElement startNode, final LSElement destNode ) { // ... } } Wenn man partout forcieren will, dass durchgehend ein Subtyp von LSElement verwendet wird, müsste man wohl schon bei LSElement selber anfangen, etwa: public interface LSElement> { List findLegalMoves(); E executeMove(T move); } > Das müsste bis auf den einen Fehler kompilierbar sein, [...] Ist es nicht. :/ > 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. Deine Lösung wäre, das Typsystem komplett auszuhebeln/zu umgehen...?! Viele Grüße Patrick