Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > de.comp.lang.java > #13267

Re: Generics und Wildcards

From "Christian H. Kuhn" <qno-news@qno.de>
Newsgroups de.comp.lang.java
Subject Re: Generics und Wildcards
Date 2019-08-21 17:32 +0200
Message-ID <gs56g2F14hvU1@mid.individual.net> (permalink)
References <gs4mcmFsqvfU1@mid.individual.net> <qjjjrs$14gi$1@news-cypress.fernuni-hagen.de>

Show all headers | View raw


Erstmal gute Besserung!

Am 21.08.2019 um 16:18 schrieb Michael Paap:

> Wenn das völlig an deinem Verständnisproblem vorbeigeht, bitte ich um
> Entschuldigung, siehe oben.

Wenn ich wüsste, ob es vorbeigeht, wäre ich schon weiter :-)

Ich schaue nach LSElements<T>. findLegalMoves() ist ein Producer und
könnte daher auch eine List<? extends T> liefern. executeMove(T move)
ist ein Consumer und könnte auch ein <? super T> verarbeiten. Ich will
aber bei beiden GENAU ein T haben. Welches T ich habe, weiß das
Interface nicht, sondern nur der, der es implementiert.

In findShortestPath(LSNode, LSNode) bekomme ich eine Liste von Zügen
durch Aufruf von findLegalMoves. Den Typ der moves kann ich nicht
vorhersagen, daher muss ich eine List<?> benutzen. Mit der kann ich kaum
arbeiten.

Durch die Hilfsmethode bekomme ich den Typ heraus. Da steht in der
Parameterliste eine List<M>, es wird eine List<?> übergeben, durch type
inference wird nachgeschaut, was M ist, und im Inneren der privaten
Hilfsmethode kann ich M verwenden. Bis hierhin funktionier ja alles, im
Zusammenhang mit List wird da nirgendwo gemeckert.

Jetzt bin ich ja immer noch an einer Stelle, an der der Compiler nichts
von einer Implementation von LSElement<T> weiß. Der schaut nur, ob
executeMove(T move) einen passenden Parameter hat. Und ich glaube, ich
beginne zu ahnen, wo es klemmt.

Im Kopf von LSGraph steht LSGraph<LSElement<?>>. Der Typparameter für
den Zug ist also ?. Das Interface LSElement<T> wird also nicht einfach
so oder mit einem festen Typparameter nachgeschaut, sondern mit ?. Damit
hab ich auch ein executeMove(? move), und daher geht da gar nichts mehr.

Ok, ich fange an zu begreifen, worin das Problem besteht. Ich sehe aber
immer noch nur die beiden Lösungen, die mir nicht gefallen: Entweder
nehme ich LSElement ohne generischen Typ und muss den Zugtyp als Object
mit allen Casts und Checks implementieren. Oder ich ändere auf
LSGraph<Move, LSElement<Move>>, dann muss der Benutzer von LSGraph
Interna der benutzten Implementation von LSElement kennen. Gibt es da
denn keine saubere generische Lösung?

lg
QNo

Back to de.comp.lang.java | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Generics und Wildcards "Christian H. Kuhn" <qno-news@qno.de> - 2019-08-21 12:57 +0200
  Re: Generics und Wildcards Michael Paap <feunews@mpaap.de> - 2019-08-21 16:18 +0200
    Re: Generics und Wildcards "Christian H. Kuhn" <qno-news@qno.de> - 2019-08-21 17:32 +0200
  Re: Generics und Wildcards "Christian H. Kuhn" <qno-news@qno.de> - 2019-08-21 18:06 +0200
  Re: Generics und Wildcards Patrick Roemer <sangamon@netcologne.de> - 2019-08-21 19:42 +0200
    Re: Generics und Wildcards "Christian H. Kuhn" <qno-news@qno.de> - 2019-08-21 21:17 +0200
      Re: Generics und Wildcards Patrick Roemer <sangamon@netcologne.de> - 2019-08-22 12:04 +0200
        Re: Generics und Wildcards "Christian H. Kuhn" <qno-news@qno.de> - 2019-08-22 13:47 +0200
          Re: Generics und Wildcards Patrick Roemer <sangamon@netcologne.de> - 2019-08-22 14:45 +0200
      Re: Generics und Wildcards Patrick Roemer <sangamon@netcologne.de> - 2019-08-25 19:36 +0200
        Re: Generics und Wildcards "Christian H. Kuhn" <qno-news@qno.de> - 2019-08-28 22:08 +0200
          Re: Generics und Wildcards Patrick Roemer <sangamon@netcologne.de> - 2019-08-29 11:11 +0200
            Re: Generics und Wildcards "Christian H. Kuhn" <qno-news@qno.de> - 2019-08-29 23:56 +0200
  Re: Generics und Wildcards Patrick Roemer <sangamon@netcologne.de> - 2019-08-22 15:43 +0200
    Re: Generics und Wildcards "Christian H. Kuhn" <qno-news@qno.de> - 2019-08-22 16:55 +0200

csiph-web