Generic Problem

Status
Nicht offen für weitere Antworten.

andre111

Bekanntes Mitglied
Hallo,

hab gerade ein Problem mit Generics, und zwar hab ich folgenden Code:

[highlight=Java]public interface A {}

public class AImpl implements A {
public void onlyInAImpl() {
System.out.println("Test");
}
}

public interface B<T extends A> {
public void foo(T param);
}

public class BImpl implements B<AImpl> {
public void foo(AImpl param) {
param.onlyInAImpl();
}
}


public class Test
{
private List<A> objects;
private Map<Class<? extends A>, B<? extends A>> map;


public Test()
{
objects = new ArrayList<A>();
objects.put(new AImpl());
map = new HashMap<Class<? extends A>, B<? extends A>>();
map.put(AImpl.class, new BImpl());
}


public void fooTest()
{
for(A a : objects)
{
map.get(a.getClass()).foo(a);
}
}
}[/highlight]

In Zeile 39 bekomme ich nun folgende Fehlermeldung:

The method foo(capture#2-of ? extends A) in the type B<capture#2-of ? extends A) is not applicable for the arguments (A).

Allerdings weis ich nicht was ich dagegen machen kann, ich vermute dass es an den definierten Generics der Map liegt. Die Generic-Struktur der Interfaces A und B möchte/muss ich allerdings so beibehalten.

Bitte um Hilfe.
Danke im Voraus

Gruß André
 
Zuletzt bearbeitet:

andre111

Bekanntes Mitglied
Wenn ich folgendes schreib:

[highlight=Java]public void fooTest()
{
for(A a : objects)
{
B b = map.get(a.getClass());
b.foo(a);
}
}[/highlight]

Dann funktioniert es, allerdings ist das ziemlich unsauber, weil dadurch die Typsicherheit verloren geht.
 
S

SlaterB

Gast
das Interface B verlangt irgeneinen Typ T extends A, genau dieser Typ T muss als Parameter übergeben werden, nicht A selber,
für BImpl ist das beispielsweise AImpl, ein anderes A bringt gar nix, führt zur ClassCastException, es muss schon genau AImpl sein,

wenn du den Typ T nicht kennst, dann kannst du die Methode eben nicht sinnvoll aufrufen,
falls es noch eine andere Methode wie T get() gibt, dann hilft dir das weiter, dann kannst du das zurückgegebene Objekt auf A casten,
aber die genaue Klasse kennst du ebenso nicht

du kannst entweder die Map auf
Map<Class<? extends A>, B<AImpl>> umbiegen, dann kannst du BImpl einfügen, diesem aber keine A-Objekte, sondern nur AImpl-Objekte übergeben

oder du verwendest eine Map
Map<Class<? extends A>, B<A>>
dann wirst du aber BImpl nicht einfügen können
 
Zuletzt bearbeitet von einem Moderator:

0x7F800000

Top Contributor
nun ja, deine methode "foo(AImpl)" aus der Klasse "BImpl implements B<AImpl>" verlangt eben ein sehr spezielles "AImpl", also kannst du natürlich kein allgemeines "A" aus dieser "List<A> objects" an diese "foo(AImpl)" methode verfüttern, was will man denn da machen? :bahnhof:

Allgemein sieht für mich das ziemlich suspekt aus, könntest du vielleicht kurz an einem konkreten Beispiel skizzieren, was du mit dieser abgefahrenen Map von Klassen vorhattest? :eek:
 

andre111

Bekanntes Mitglied
Ich arbeite grad an nem Projekt bei dem sich einzelne Shapes mit der Maus bewegen, drehen, vergrößern, verkleinern lassen. Dabei gibt es für jeden ShapeTyp (z.B. ein Rechteck) eine Klasse Shape die die Position, Farbe usw speichert, und einen "ShapeManager" der sich um das verschieben usw. kümmert.

Jetzt hat jedes Shape einen ShapeManager, da sich jedes Objekt in gewisser Weise anders verhält.

In der Map hab ich nun zum jeweiligen Shape den zugehörigen ShapeManager abgespeichert und in der List die einzelnen Shapes selber.

In gewisser Weise weis man ja dann welcher Manager zu welchem Shape gehört, da ich ja mit shape.getClass() den passenden Manager aus der Map "hole".

(A entsprach dem Shape, B dem Manager und Test dem gesamten "Bild" in dem alles stattfindet).
 
S

SlaterB

Gast
tja, zu solcher Dynamik hat Generics glaube ich nicht das beste Verhältnis,

man kann sicher nicht garantieren, dass beim Einfügen in
Map<Class<? extends A>, B<? extends A>>
das Class-Objekt des Keys zum Value passt, die beiden Angaben sind nicht verknüpft,

generell könntest du an dieser Stelle auf Generics verzichten und alles passend casten und darauf vertrauen, dass alles nur korrekt definiert ist,
oder zumindest diese Ungenauigkeit auf genau zwei Methoden beschränken:

Code:
class SpecialMap {
private Map<Class<? extends A>, B<? extends A>> map 
      = new HashMap<Class<? extends A>, B<? extends A>>();


public <T extends A> B<T> get(Class<T> c) {
   return map.get(c);
}

public <T extends A> B<T> get(T t) {
   return map.get(t.getClass());
}

public <T extends A> void put(Class<T> c, B<T> b) {
      map.put(c, b);
}

}
so in der Tat, ungetestet, vielleicht mit abweichender Syntax,
eine der beiden get-Methoden wird sicher reichen

bei beiden get() wird immer noch die generische Unsicherheit auftreten,
da man da sowieso Warnings unterdrücken und/ oder Casten muss, könnte man vielleicht genauso gut
private Map map = new HashMap();
verwenden

die put()-Methode garantiert hier, dass es keinen Ärger geben wird
 
Zuletzt bearbeitet von einem Moderator:

andre111

Bekanntes Mitglied
Im Prinzip besteht keine Unsicherheit, da ich beim einfügen in die Map überprüfe ob das Shape zum Manager passt.
Also danke :)
André
 

0x7F800000

Top Contributor
Ääähm, und wieso dann der umweg über die Map, warum weist du jeder Shape nicht einfach den passenden ShapeManager zu?

Irgendwiesowas würde mir da spontan einfallen:
[HIGHLIGHT="Java"]
interface ShapeManager<X extends Shape<X>>{
void move(X x);
void rotate(X x);
}

interface Shape<X>{
ShapeManager<X> getShapeManager();
}

class Rectangle implements Shape<Rectangle>{
int x, y;

private static final ShapeManager<Rectangle> rectShapeManager=
new ShapeManager<Rectangle>{
@Override
public void move(Rectangle rect){
rect.x+=23;
rect.y+=32;
}
...
}
};

@Override
public ShapeManager<Rectangle> getShapeManager(){
return rectShapeManager;
}
}
[/HIGHLIGHT]
ich weiß jetzt nicht, ob das auch nur annähernd optimal ist, was ich aber sagen will: lass diese komischen class-maps weg, und gebe den passenden shapeManager lieber direkt von der dazugehörigen shape zurück.
 

andre111

Bekanntes Mitglied
[highlight="Java"]
interface ShapeManager<X extends Shape<X>>{
void move(X x);
void rotate(X x);
}

interface Shape<X>{
ShapeManager<X> getShapeManager();
}

class Rectangle implements Shape<Rectangle>{
int x, y;

private static final ShapeManager<Rectangle> rectShapeManager=
new ShapeManager<Rectangle>{
@Override
public void move(Rectangle rect){
rect.x+=23;
rect.y+=32;
}
...
}
};

@Override
public ShapeManager<Rectangle> getShapeManager(){
return rectShapeManager;
}
}
[/highlight]

Das funktioniert so noch nicht ganz, weil:

interface Shape<X>{
ShapeManager<X> getShapeManager();
}

Allerdings müsste auch X Unterklasse von Shape sein, da der ShapeManager ja auch ein X extends Shape will. Ich habs jetzt so:

[highlight=Java]interface ShapeManager<T extends Shape<T>> {}

interface Shape<T>
{
public ShapeManager<Shape<T>> getShapeManager();
}

class Rectangle extends Shape<Rectangle>
{
public ShapeManager<Rectangle> getShapeManager()
{
return ...;
}
}[/highlight]
 
Zuletzt bearbeitet:

0x7F800000

Top Contributor
Hm Hm Hm, warnings sind schlecht.
Ich habe durch ein wenig rumfummeln an generics festgestellt, dass auch bei größeren aufeinandergestapelten generics-Konstrukten Warnings fast immer vermeidbar sind ???:L

Hast du die jetzt wegbekommen?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G generic interface problem Java Basics - Anfänger-Themen 12
wolei Java generic interface in a generic class Java Basics - Anfänger-Themen 6
L Datentypen Deklarierte Felder einer Generic Klasse bestimmen Java Basics - Anfänger-Themen 7
O Comparable Generic Java Basics - Anfänger-Themen 24
F Type safety: A generic array of.. Fehler Java Basics - Anfänger-Themen 3
Yjuq Generic Methode - Wie muss die List Definition aussehen? Java Basics - Anfänger-Themen 3
S Gibt es für die Klasse HashMap Generic Implementierungen? Java Basics - Anfänger-Themen 11
C Generic im Konstruktor Java Basics - Anfänger-Themen 1
O Generic - Verstädnisproblem Java Basics - Anfänger-Themen 5
G instanceof in Generic Java Basics - Anfänger-Themen 7
N Datentypen LocalDate Generic Comparable Java Basics - Anfänger-Themen 2
P Variablen generic type variablen in object array Java Basics - Anfänger-Themen 1
M Generic Prüfungsvorbereitung Java Basics - Anfänger-Themen 4
G Generic und Listen Java Basics - Anfänger-Themen 8
J Generic - Autoboxing Java Basics - Anfänger-Themen 18
N Generic clonen => eclipse empfiehlt @SuppressWarnings("unchecked") Java Basics - Anfänger-Themen 2
S Generic Java Basics - Anfänger-Themen 9
P Java Generic Wildcard Java Basics - Anfänger-Themen 2
G Namen der Generic Klasse Java Basics - Anfänger-Themen 3
D generic extendet class Java Basics - Anfänger-Themen 10
M Generic's und Vererbung Java Basics - Anfänger-Themen 6
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
capgeti Datentypen Static generic return value von Subclass? Java Basics - Anfänger-Themen 9
C Generic Tutorial Java Basics - Anfänger-Themen 12
T Generic vom Generic: Zu sehr verschachtelt? Java Basics - Anfänger-Themen 6
V libssrckdtree-j Generic k-d tree Java library - weiss nicht wo des hin soll Java Basics - Anfänger-Themen 2
L Sinn hinter Generic? Java Basics - Anfänger-Themen 5
0 Was bedeutet dieser Generic-code? Java Basics - Anfänger-Themen 3
S Generic Methode: syntax klemmt Java Basics - Anfänger-Themen 10
S Generic: Verständnisfrage Java Basics - Anfänger-Themen 2
S generic programmierung "ne:w T[X]" Java Basics - Anfänger-Themen 2
Safado generic array creation Java Basics - Anfänger-Themen 2
G Frage zur Generic java ? Java Basics - Anfänger-Themen 9
G eine Frage zur Generic Java ? Java Basics - Anfänger-Themen 8
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
imocode Vererbung Problem mit Vererbung Java Basics - Anfänger-Themen 2
L Taschenrechner Problem Java Basics - Anfänger-Themen 4
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
A ScheduledExecutorService problem Java Basics - Anfänger-Themen 7
marcelnedza Problem mit Weltzuweisung, JavaKarol Java Basics - Anfänger-Themen 13
XWing Methoden rückgabe Problem? Java Basics - Anfänger-Themen 6
M Erste Schritte Collatz Problem max int Java Basics - Anfänger-Themen 3
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
C GLOOP Problem beim Erstellen der Kamera Java Basics - Anfänger-Themen 9
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
frager2345 Problem mit Methode Java Basics - Anfänger-Themen 4
L Problem bei Rechnung mit Math.pow Java Basics - Anfänger-Themen 13
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
SUPERTJB return Problem Java Basics - Anfänger-Themen 3
sserio BigInteger Problem Java Basics - Anfänger-Themen 4
JordenJost Taschenrechner problem Java Basics - Anfänger-Themen 5
K Problem mit "Random" Java Basics - Anfänger-Themen 5
S Datei anlegen Problem! Groß- und Kleinschreibung wird nicht unterschieden Java Basics - Anfänger-Themen 4
sserio Problem beim Anzeigen Java Basics - Anfänger-Themen 5
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2
L Unbekanntes Problem mit 2d Array Java Basics - Anfänger-Themen 6
sserio Liste erstellt und ein Problem mit dem Index Java Basics - Anfänger-Themen 8
sserio Schwimmen als Spiel. Problem mit to String/ generate a card Java Basics - Anfänger-Themen 4
J Schleife Problem Java Basics - Anfänger-Themen 2
D Problem mit der Erkennung von \n Java Basics - Anfänger-Themen 2
milan123 das ist meine aufgabe ich hab das problem das bei mir Wenn ich die Richtung der Linien verändern will und drei davon sind richtig, verändere ich die 4 Java Basics - Anfänger-Themen 3
M Verständins Problem bei Aufgabe Java Basics - Anfänger-Themen 4
HeiTim Problem mit der Kommasetzung an der richtigen stelle Java Basics - Anfänger-Themen 59
Temsky34 Problem mit dem Code Java Basics - Anfänger-Themen 17
P Problem mit Calendar.getDisplayName() Java Basics - Anfänger-Themen 8
C Problem mit mehreren Methoden + Scanner Java Basics - Anfänger-Themen 5
P Datei einlesen, nach Begriff filtern und in Datei ausgeben. Problem Standardausgabe über Konsole Java Basics - Anfänger-Themen 19
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
H Problem mit Verzweigungen Java Basics - Anfänger-Themen 6
H Problem mit Rückgabewert Java Basics - Anfänger-Themen 7
josfe1234 JAVA FX problem Java Basics - Anfänger-Themen 3
A Code Problem Java Basics - Anfänger-Themen 6
Henri Problem von Typen Java Basics - Anfänger-Themen 7
J Problem mit "ArrayIndexOutOfBoundsException" Java Basics - Anfänger-Themen 11
K jackson Mapping - Problem mit Zeitzonen Java Basics - Anfänger-Themen 10
B Threads Problem mit mehreren Threads Java Basics - Anfänger-Themen 38
I Output BigDecimal anstatt double / Problem beim Rechnen Java Basics - Anfänger-Themen 16
D Schleifen Problem Java Basics - Anfänger-Themen 2
H So viele Fehlermeldungen, dass ich nicht weiß wo das Problem ist. Java Basics - Anfänger-Themen 6
J JAVA-Problem blockiert MEDIATHEKVIEW Java Basics - Anfänger-Themen 13
T Problem mit Lehrzeichen und String bei einfacher Chiffre Java Basics - Anfänger-Themen 8
J extends Problem Java Basics - Anfänger-Themen 2
C Polymorphie-Problem Java Basics - Anfänger-Themen 3
Kalibru Problem bei Ausgabe von Objekt Java Basics - Anfänger-Themen 1
I Format Problem mit Wert - bekomme 0,10 anstatt 10,00 Java Basics - Anfänger-Themen 6
J Problem mit einer Methode die gewissen Inhalt einer Array löschen soll Java Basics - Anfänger-Themen 9
J Problem mit einer Methode, die beliebig viele Objekte in Array speichern soll Java Basics - Anfänger-Themen 6
J Allgemeines Problem mit Klassen Java Basics - Anfänger-Themen 5
U Problem mit dem initialisieren meines Strings in einer Schleife Java Basics - Anfänger-Themen 5
amgadalghabra algorithmisches Problem Java Basics - Anfänger-Themen 19
J Traveling Salesman Problem [Arrays] Java Basics - Anfänger-Themen 9
R ArrayList Problem Java Basics - Anfänger-Themen 6
InfinityDE Problem mit Datenübergabe an Konstruktor Java Basics - Anfänger-Themen 7
C RegEx Problem Java Basics - Anfänger-Themen 4
J Anfänger TicTacToe, Problem bei Gewinnoption, sowohl Unentschieden Java Basics - Anfänger-Themen 8
E Taschenrechner GUI Problem mit Fehlerhandling Java Basics - Anfänger-Themen 6
M Input/Output Fallunterscheidung Problem Java Basics - Anfänger-Themen 17
P Problem beim Überschreiben einer vererbten Methode Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben