Ich habe ein recht spezielles Problem mit Generics. Dazu erstmal ein Beispielcode:
Eine Methode einer Library ((Ext-)GWT falls es wen interessiert) liefert mir eine List<Column<?>>. Ich möchte diese durchgehen, und jeder Spalte eine AbstractCell zuweisen. Der Code funktioniert, allerdings bekomme ich (offensichtlich) eine Warning: "AbstractCell is a raw type".
Nun, das waren meine bisherigen Versuche, diese wegzubekommen:
1.) new AbstractCell<Object>()
Das führt zu einem Error:
2.) (List<Column<Object>>) MyThirdPartyLibrary.getColumns()
Auch der Cast schlägt fehl:
3.) new AbstractCell<?>
Klar, war rauskommt:
Vielen Dank schon mal!
Code:
public class Main
{
static class MyThirdPartyLibrary
{
public MyThirdPartyLibrary()
{
}
public static List<Column<?>> getColumns()
{
List<Column<?>> columns = new ArrayList<Column<?>>();
Column<?> column1 = new Column<String>();
Column<?> column2 = new Column<Integer>();
columns.add(column1);
columns.add(column2);
return columns;
}
}
public static void main(String[] args)
{
new Main();
}
public Main()
{
for (Column<?> column : MyThirdPartyLibrary.getColumns())
{
column.setCell(new AbstractCell()
{
@Override
public void doSomething(Object muh)
{
//
}
});
}
}
static class Column<U>
{
public void setCell(Cell<U> cell)
{
}
}
interface Cell<U>
{
void doSomething(U muh);
}
abstract class AbstractCell<U> implements Cell<U>
{
}
}
Eine Methode einer Library ((Ext-)GWT falls es wen interessiert) liefert mir eine List<Column<?>>. Ich möchte diese durchgehen, und jeder Spalte eine AbstractCell zuweisen. Der Code funktioniert, allerdings bekomme ich (offensichtlich) eine Warning: "AbstractCell is a raw type".
Nun, das waren meine bisherigen Versuche, diese wegzubekommen:
1.) new AbstractCell<Object>()
Das führt zu einem Error:
Code:
The method setCell(Main.Cell<capture#3-of ?>) in the type Main.Column<capture#3-of ?> is not applicable for the arguments (new Main.AbstractCell<Object>(){})
2.) (List<Column<Object>>) MyThirdPartyLibrary.getColumns()
Auch der Cast schlägt fehl:
Ich nehme einfach mal hin, dass man ? und Object nicht gleichsetzen oder casten kann. Wie kann ich nun die "raw type" warning "sauber" wegbekommen, oder diese zu unterdrücken? Das Problem ist, dass ich auf die Methode getColumns keinen Einfluss habe, und diese Wildcards benutzt. Und wieso klappt mein Versuch nicht, Object einzusetzen, um dann mittels instanceof den Typ zu überprüfen?Cannot cast from List<Main.Column<?>> to List<Main.Column<Object>>
3.) new AbstractCell<?>
Klar, war rauskommt:
The type new AbstractCell(){} cannot extend or implement Main.AbstractCell<?>. A supertype may not specify any wildcard
Vielen Dank schon mal!