Liste mit objekten von Generic Type, mit verschiedenen typen?


UncleBob

Mitglied
Hallo, ich hab da ne kleine Frage. Ich hab ne klasse mit Generic Type:

Code:
public class LookupTable<T>

Nun möchte ich gerne mehrere dieser Objekte in einer Liste deponieren, aber sie haben unterschiedliche typen. Ich dachte eigentlich das müsste kein Problem sein wenn ich die Liste so definiere:

Code:
private List<LookupTable<Object>> tablesList;

Nun habe ich aber ein Objekt vom typ LookupTable<Integer>, und die Liste will mir das partout nicht zulassen:

Code:
        tablesList = new ArrayList<LookupTable<Object>>();
        LookupTable<Integer> newTable = new LookupTable<Integer>(3,6);
        tablesList.add(newTable);

Soweit ich sehen kann erbt Integer von Number das von Object erbt, also müsste das doch eigentlich funktionieren? Kann mir jemand sagen wie ich das angehen müsste?
 

Cymatoxa

Mitglied
Hey,
du erlaubst tatsächlich nur direkte Object-Typen, aber keine Elemente, die von Object erben.
Für Typen, die alle von einer bestimmten Klasse erben kannst du <? extends Type> benutzen, z.B.
Code:
List<LookupTable<? extends Point2D>> tablesList = new ArrayList<LookupTable<? extends Point2D>>();
Damit könntest du nur Objekte zu deiner Tabelle hinzufügen, die von Point2D erben, also bspw. Point2D.Float oder Point.
Inzwischen (ich glaube seit Java 1.7) ist auch das s.g. Diamond Interface erlaubt:
Code:
List<LookupTable<? extends Point2D>> tablesList = new ArrayList<>();
Dadurch spart man sich doppelten code.
Für dich wäre im Endeffekt
Code:
List<LookupTable<? extends Object>> tablesList = new ArrayList<>();
das richtige. Für Generische Typen, die alle beliebige Typen annemen können sollen, kann allerding auch das "generische Argument" einfach weggelassen werden:
Code:
List<LookupTable> tablesList = new ArrayList<LookupTable>();
LookupTable newTable = new LookupTable(3, 6);
tablesList.add(newTable);

Schöne Grüße
 

Improof

Erfahrenes Mitglied
Für Generische Typen, die alle beliebige Typen annemen können sollen, kann allerding auch das "generische Argument" einfach weggelassen werden:
Java:
List<LookupTable> tablesList = new ArrayList<LookupTable>();
LookupTable newTable = new LookupTable(3, 6);
tablesList.add(newTable);

Wobei das dann natürlich die unschöne Warning "[Klasse] is a raw type. References to generic type [Klasse]<E> should be parameterized" vom Compiler gibt ;)

Die Lösung mit <? extends Object> ist in diesem Fall genau richtig :) Du musst dann nur selbst genau wissen, welches Element in deiner Liste von welchem Typ ist! Denn die Elemente haben dann natürlich alle nur den Type Object und du musst ggf. noch casten, je nachdem, was du damit machen willst.
 

Neue Beiträge