ClassLoading bei zu typisierenden Klassen

Status
Nicht offen für weitere Antworten.

reibi

Top Contributor
Hallo

Weiss jemand ne Lösung für folgendes Problem:
Java:
        Class<?> myClass = Class.forName("java.util.ArrayList");
        List<?> myList2 = (List<?>) myClass.newInstance();

        //Bis hierher geht alles prima !!

        List<String> myList = (List<String>) myList2;

        //Hier sagt mir das liebe Eclipseli folgendes :
        //Type safety: Unchecked cast from List<capture#7-of ?> to List<String>

        myList.add("Hallo");
        System.out.println("out : " + myList.get(0));
Das funktioniert mit einfachen Klassen wie String oder OracleResultSet übrigens prima. Ihn stört nur die Typisierung.

Ziel: Ich möchte zur CompileZeit eine saubere Lösung. Is schon klar dass es grundsätzlich funktioniert.
 
Zuletzt bearbeitet von einem Moderator:
Ein List<?> ist eben kein List<String>. Da kann man nichts dran ändern, bis auf @SuppressWarnings("unchecked")
 
kleine Grundregel:
in Casts nie generische Klammern, man kann nicht generisch sicher casten
->
List<?> myList2 = (List) myClass.newInstance();
List<String> myList = (List) myList2;
 
@tfa
>> @SuppressWarnings("unchecked")

Genau das ist qickUndDirty zur CompileZeit ;-)

Wenn man eine externe Lib verwendet, wo nicht nach Sauberkeit programmiert wurde ist das ganz klar unumgänglich.
Da ich hier aber reines Java(SUN) schreibe und die schon 2 Versionen mit Typisierung rausgegeben haben, kann ich mir nich so richtig vorstellen, dass es da keine Lösung geben soll.

Trotzdem Danke für den Versuch ;-)
 
Du weißt, dass es (Java-)Generics nur zur Compilezeit gibt?
Reflection verträgt sich damit nicht besonders.
 
List<?> ist nix anderes als List, daher ist Q&D wohl etwas "normales" wenn man aus untypisierten Listen auf typisierte casted.
 
@maki

Is schon klar... aber der Psoudocast auf <?> unterdrückt die Meldung ;-)

Ich kann den Cast halt auch schon oben probieren, dann bekomme ich aber oben schon die Meldung ...
 
@tfa
>>>Du weißt, dass es (Java-)Generics nur zur Compilezeit gibt?

Das weiss ich ... hab ich oben auch schon betont, dass es mir nur um die Meldung geht
siehe :
>>> Ziel: Ich möchte zur CompileZeit eine saubere Lösung. Is schon klar dass es grundsätzlich funktioniert.

Trotzdem danke an Alle fürs kopfzerbrechen ;-)
 
@SlaterB

Im Endeffekt noch schlimmer!
siehe Hier:
http://img179.imageshack.us/img179/4696/qtext.jpg

qtext.jpg
 
Zuletzt bearbeitet von einem Moderator:
@Maki
>>>Eben, ist aber genauso "sauber" wie @SuppressWarnings("unchecked")

Vielleicht subjektiv aber : Für mich bene nicht ;-)

Kastereien und Typisierungen sind ja irgendwie besser als eine Unterdrückung einer Warnung ... oder?
 
Kastereien und Typisierungen sind ja irgendwie besser als eine Unterdrückung einer Warnung ... oder?
In diesem Fall komen sie auf dasselbe raus, es macht eben keinen Unterschied, daru geht es doch hier.

Es gibt keinen sauberen Weg um aus List eine List<String> zu machen, ist immer unsauber.
Der Cast vorher nach List<?> vewirrt den Kompiler aber nur, deswegen gibt es keine Warnung, deswegen ist es aber nicht besser als @SuppressWarnings("unchecked"), sondern genauso "sauber".
 
@maki
neee ;-)

@byto
klar ... ich mein aber nur zur Compilezeit ... ohne cast kann er zur Laufzeit auch auf die Fr... fliegen


;-)
 
Hallo zusammen ...

Ich hab mich jetzt für folgendes entschieden

Java:
@SuppressWarnings("unchecked") 
List<String> myList = (List<String>) myClass.newInstance();

obwohl ich sowas nich unbedingt mag.

Danke trotzdem ALLEN um die angeregte Disko ;-)
 
> @SuppressWarnings("unchecked")
> List<String> myList = (List<String>) myClass.newInstance();

äquivalent:

@SuppressWarnings("unchecked")
List<String> myList = (List) myClass.newInstance();

vielleicht nur, falls die Warnung raw type generell ausgeschaltet ist
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben