Generics: Wildcard und Object

darekkay

Bekanntes Mitglied
Ich habe ein recht spezielles Problem mit Generics. Dazu erstmal ein Beispielcode:

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:
Cannot cast from List<Main.Column<?>> to List<Main.Column<Object>>
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?

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!
 

Marco13

Top Contributor
Es geht nicht. Und das ist auch gut und richtig so. Alles andere würde die Typsicherheit gefährden:

Java:
public class Main
{
    static class MyThirdPartyLibrary
    {
        // I know that I only have 'Integer' columns
        private static List<Column<Integer>> columns = new ArrayList<Column<Integer>>();

        // But I won't tell ya :D 
        public static List<Column<?>> getColumns()
        {
            Column<Integer> column1 = new Column<Integer>();
            Column<Integer> column2 = new Column<Integer>();
            columns.add(column1);
            columns.add(column2);
            return columns;
        }

        public static void processThem()
        {
            Column<Integer> column = columns.get(0); // This works
            Integer integer = column.getValue(); // This also works...
            // except when someone put in something that
            // is not an Integer - then this will crash...
        }
    }

Wenn man dann sowas machen würde
Java:
    public Main()
    {
        Cell<String> stringCell = ...
        MyThirdPartyLibrary.getColumns().get(0).setCell(stringCell);
        MyThirdPartyLibrary.processThem();
    }
und die zweite Zeile so funktionieren WÜRDE, dann würde es ihn bei "processThem" raushauen, weil dort kein Integer drin steht.

Man kann sinngemäß(!) sagen, dass eine List<?> sozusagen "read only" ist - man weiß einfach nicht, was man reinpacken darf und was nicht (außer [c]null[/c] ;) )

Wie man damit umgeht... kann man pauschal kaum sagen, hängt vom Anwendungsfall ab...
 

darekkay

Bekanntes Mitglied
Also bedeutet "?" nichts anderes, als eine Typvariable - bloß dass man diese nicht wiederverwenden möchte? Dann macht es Sinn. Und ich kann nichts dagegen machen, da die Library zwar Generics nutzt, diese für mein Beispiel (verschieden parametrisierte Columns) aber keine Rolle spielen, da ich trotzdem reinpacke, wonach mir gerade ist (und das auch so gewollt ist, da man bsp. eine Integer- und eine String-Spalte haben möchte). Dann muss ich die Warning doch unterdrücken.

Vielen Dank!
 
S

SlaterB

Gast
mit der Liste hast du hier direkt auch kein Problem, das add() geht ja,
nur ist nicht bekannt, welchen Typ die unterschiedlichen Columns haben,

verkürzt kann man sich ohne Liste auf
> Column<?> column1 = new Column<String>();
stürzen, wobei in dieser einzelnen Variable unklar ist, warum der Typ nicht in der Variablen steckt,
aber wenn eben, dann fehlt diese Information,

Object kann es nicht sein bzw. wäre vollkommen unsicher,
analog zum List-Beispiel kennt jemand die Column vielleicht als <String>, was ja der wahre Typ ist, will später String auslesen,
da wäre es fatal wenn du nur ein Object hineinspeicherst, auch wenn es hier im Moment keine entsprechende Methode gibt,

wenn der Typ unbekannt ist entfällt Generics sowieso,
was ansonsten passieren soll, welche Cell für alle oder einige Columns geeignet ist, ist hier nicht erkennbar
 

darekkay

Bekanntes Mitglied
Wow, ich konnte es doch noch lösen. Man merkt, dass ich mich mit den advanced techniques für generics beschäftigen sollte ^^
Ich habe die problematische Stelle einfach in eine generische Methode ausgelagert und eine Typvariable vergeben:
Code:
    public Main()
    {
        for (Column<?> column : MyThirdPartyLibrary.getColumns())
        {
            genericMethod(column);
        }
    }

    protected <U> void genericMethod(final Column<U> column)
    {
        column.setCell(new AbstractCell<U>()
        {

            @Override
            public void doSomething(U muh)
            {
                // 
            }
        });
    }
Wie gesagt, die Typsicherheit innerhalbt der Liste ist so oder so nicht gegeben, da die List<Column<?>> gleichzeitig verschiedene Spaltentypen enthält. Nun ist aber immerhin die Warnung weg.
 

Marco13

Top Contributor
Für so einen konkreten Anwendungsfall ist das Erstellen einer solchen Methode zumindest nicht unüblich (d.h. für einen Fall, wo man das ""U"" nicht schon hat oder kennt oder gar selbst festlegen will)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Best Practice Generics mit Enum Allgemeine Java-Themen 3
H Kombination Interface und Abstrakte Klasse bei Generics Allgemeine Java-Themen 3
Zeppi Cast Object in Generics Allgemeine Java-Themen 4
P Generics und Arrays Allgemeine Java-Themen 6
M Generics / Typen Allgemeine Java-Themen 1
Kirby.exe InsertionSort mit Generics Allgemeine Java-Themen 33
Kirby.exe Vererbung bei Generics Allgemeine Java-Themen 7
H Klarnamen etc... (von Wie Generics lernen?) Allgemeine Java-Themen 26
D Wie Generics lernen? Allgemeine Java-Themen 26
L Compiler-Fehler Generics beim Anhängen von Predicates Allgemeine Java-Themen 1
W Vererbung Generics - mal wieder die verhaßte Rückwärtskompatibilität Allgemeine Java-Themen 2
S Verstaendnisfrage Generics Allgemeine Java-Themen 19
W Generics + Vererbung Allgemeine Java-Themen 47
I Methoden Generics-Methode Allgemeine Java-Themen 3
D Mit Generics arbeiten - Übungsaufgabe Allgemeine Java-Themen 3
K Factory Pattern: Mit Generics umgehen Allgemeine Java-Themen 6
G Generics Allgemeine Java-Themen 31
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
Hacer Generics & Collections Allgemeine Java-Themen 8
Neumi5694 Interface Generics für Enum-Filterung verwenden Allgemeine Java-Themen 5
H Collector Generics Problem (incl. Stream & Lambda) Allgemeine Java-Themen 4
C Gemeinsame Oberklasse zweier Generics Allgemeine Java-Themen 10
erdmann Datentypen Methodendeklaration mit Generics Allgemeine Java-Themen 2
Z Datentypen Verschachtelte Generics Allgemeine Java-Themen 1
Neumi5694 Datentypen Generics Allgemeine Java-Themen 5
S Mit Generics Klasse erstellen die selbst T erweitert..? Allgemeine Java-Themen 4
Tarrew Generics - Type erasure Allgemeine Java-Themen 5
N Problem mit Generics und Interface Allgemeine Java-Themen 4
H Generics als Parameter Allgemeine Java-Themen 1
kaoZ Generics und Vererbung Allgemeine Java-Themen 3
A Datentypen Generics: Wie am besten auf Typparameter zugreifen Allgemeine Java-Themen 2
C Generics Objekt in ArrayList Allgemeine Java-Themen 2
vandread Kleine Generics Aufgabe aus einer Prüfung... wie ist das gemeint? Allgemeine Java-Themen 6
G Generics sind zu streng - oder ich zu naiv? Allgemeine Java-Themen 3
G Verschachtelte Generics Allgemeine Java-Themen 2
O Generics Allgemeine Java-Themen 42
M Problem mit Generics Allgemeine Java-Themen 10
M Generics (bounded wildcards statt Interface Bezeichnern) -- Sinn oder Unsinn? Allgemeine Java-Themen 2
H Collections Generics und Reflection Allgemeine Java-Themen 6
F Google Guice + Generics + Vererbung Allgemeine Java-Themen 5
H Problem mit Java Generics Allgemeine Java-Themen 6
J Generics: Typparameter als Klasse zurückliefern Allgemeine Java-Themen 4
H Generics Allgemeine Java-Themen 5
P Probleme mit Generics Allgemeine Java-Themen 5
B Generics und primitve arrays Allgemeine Java-Themen 6
M Generics Allgemeine Java-Themen 11
1 Collections Generics, internes Verhalten Allgemeine Java-Themen 16
T Warnungsfreie Verwendung von Generics Allgemeine Java-Themen 11
M Probleme mit Generics Allgemeine Java-Themen 5
D Java Generics Allgemeine Java-Themen 8
2 Generics: bounded wildcards Allgemeine Java-Themen 4
J Generics / vermeiden von downcasts Allgemeine Java-Themen 2
2 Generics oder nicht? Allgemeine Java-Themen 8
E Problem mit Generics und Comparable Allgemeine Java-Themen 16
W Erweitern einer Klasse mit Generics Allgemeine Java-Themen 8
H Generics für Methode Allgemeine Java-Themen 14
N Überladen mit Hilfe von Generics Allgemeine Java-Themen 3
S Generics: Fuer Set<T> ein T-Klassenobjekt erhalten? Allgemeine Java-Themen 3
Q Der innere Typ von Generics? Allgemeine Java-Themen 3
N Generics-NullpointerException Allgemeine Java-Themen 7
2 Generics - Typ Allgemeine Java-Themen 12
P Generics Problem Allgemeine Java-Themen 10
S Type safety Warnings beim casten von Generics Allgemeine Java-Themen 6
N Generics Allgemeine Java-Themen 3
V Frage zu Generics Allgemeine Java-Themen 2
S java generics klassen deklaration Allgemeine Java-Themen 7
B hashtable für unterschiedliche Typen - mit Generics Allgemeine Java-Themen 8
E Generics Allgemeine Java-Themen 3
MQue Generics Allgemeine Java-Themen 4
R Problem mit Reflection und Generics Allgemeine Java-Themen 3
C Klassen, die aufeinander verweisen (mit Generics) Allgemeine Java-Themen 16
G Generics - W.card unter Nutzung von Annotationsklasse? Allgemeine Java-Themen 6
G sortieren von generics Allgemeine Java-Themen 10
G Generics in Map. Type of value abhängig vom key Allgemeine Java-Themen 3
A Generics Verständnisfrage Allgemeine Java-Themen 7
Z Generics funzt nicht? Allgemeine Java-Themen 2
T Generics Allgemeine Java-Themen 18
G ComboBox: Nur eine Art Klasse zulassen (Generics) Allgemeine Java-Themen 3
J Generics Expertenwissen? Allgemeine Java-Themen 5
S Generics-Problem Allgemeine Java-Themen 3
T Generics und Wil-dcards Allgemeine Java-Themen 8
Q Typen von Generics & Casten Allgemeine Java-Themen 3
S Generics Allgemeine Java-Themen 2
R Problem mit Generics Allgemeine Java-Themen 2
G Trotz Generics Cast-Fehler! Allgemeine Java-Themen 5
T TreeMap durch Comparator mit Generics sortieren Allgemeine Java-Themen 9
T Generics und instanceof Allgemeine Java-Themen 10
T Generics und Exceptions Allgemeine Java-Themen 6
M Beliebig viele Typen bei Generics Allgemeine Java-Themen 3
G Reflection objekt mit generics erzeugen Allgemeine Java-Themen 5
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
G Generics und Comparable Allgemeine Java-Themen 11
H Generics Problem Allgemeine Java-Themen 3
F Generics: spricht etwas dagegen raw types zu verwenden? Allgemeine Java-Themen 31
M Generics - besser programmieren, Warnung umgehen Allgemeine Java-Themen 4
E Java, UML, Generics Allgemeine Java-Themen 6
P Array von Vectoren + Generics Allgemeine Java-Themen 6
M ArrayList erweitern - generics Allgemeine Java-Themen 4
E Generics -> UML Allgemeine Java-Themen 4
G Generics: Instanzieren einer Klasse in einer Methode. Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben