Warnungen bei Vector<MyType> vs. Vector
MudGuard
- java
0 Thomas J.S.0 MudGuard
0 Axel Richter0 Marc Reichelt0 Slyh
0 Slyh0 MudGuard
Hallo,
Eclipse wirft mir Warnungen, die ich leider nicht wegbekomme:
Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<MyFirstType>
Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<MySecondType>
Die Ursache ist mir auch klar.
Ich habe Vector<MyFirstType> und Vector<MySecondType>, dem ich das Ergebnis eines Funktionsaufrufs zuweise.
Die Funktion (leider nicht unter meiner Kontrolle ...) liefert immer einen Vector, nicht einen Vector<MyFirstType> oder Vector<MySecondType>, obwohl je nach Aufruf immer nur Objekte des einen oder des anderen Typs darin enthalten sein können (die Klasse wird als Parameter übergeben.
Also
Vector<MyFirstType> mftv = someObject.call(MyFirstType.class);
Vector<MySecondType> mstv = someObject.call(MySecondType.class);
Es ist also sichergestellt, daß alle Objekte im Vektor jeweils den richtigen Typ haben.
Kann ich Eclipse das irgendwie klarmachen?
Wenn ich den Vektor einem Typecasting unterziehe à la
Vector<MyFirstType> mftv = (Vector<MyFirstType>) call(MyFirstType.class);
ist zwar die ursprüngliche Warnung weg, dafür aber eine andere da:
Type safety: The cast from Vector to Vector<MyFirstType> is actually checking against the erased type Vector
Bekomme ich also die Warnungen irgendwie weg, ohne von Vector<MyFirstType> und Vector<MySecondType> auf Vector umstellen zu müssen?
Und ohne ein explizites Umkopieren ...
Danke,
Andreas
Hallo,
Eclipse wirft mir Warnungen, die ich leider nicht wegbekomme:
Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<MyFirstType>
Grundsätzliche Fragen:
Du kompiliert gegen Java 5. Welche Eclipse Version hast du? (3 kann das noch nicht) Hast du im 3.1 eingestellt, dass es Java 5 (1.5) verwenden soll?
Zum Fehler: Die Ursache hast du ja selbst herausgefunden.
someObject.call(MyFirstType.class) liefert immer nur ein Vector, das (sprich jedes Objekt im Vector) dann ungeprüft nach Vector<MyFirstType> gecastet werden soll.
Du kannst diese Fehlermeldungen in Eclipse aussschalten.
Oder kannst so etwas versuchen:
Vector<MyFirstType<Object>> mftv = someObject.call(MyFirstType.class);
Ev es Hilft dir weiter:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html
Grüße
Thomas
Hi,
Eclipse wirft mir Warnungen, die ich leider nicht wegbekomme:
Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<MyFirstType>Grundsätzliche Fragen:
Du kompiliert gegen Java 5. Welche Eclipse Version hast du? (3 kann das noch nicht) Hast du im 3.1 eingestellt, dass es Java 5 (1.5) verwenden soll?
Eclipse 3.2.1, ja, ist so eingestellt, daß Java 5 verwendet werden soll (sonst käm es ja zu Compile-Fehlern).
Zum Fehler: Die Ursache hast du ja selbst herausgefunden.
someObject.call(MyFirstType.class) liefert immer nur ein Vector, das (sprich jedes Objekt im Vector) dann ungeprüft nach Vector<MyFirstType> gecastet werden soll.
Du kannst diese Fehlermeldungen in Eclipse aussschalten.
Ne, ich will nicht grundsätzlich diese Warnung deaktivieren, ich will sie nur in den Fällen, in denen ich weiß, daß sie eigentlich nicht zutrifft (Eclipse das aber nicht wissen kann), weghaben ...
Oder kannst so etwas versuchen:
Vector<MyFirstType<Object>> mftv = someObject.call(MyFirstType.class);
Ev es Hilft dir weiter:
http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf
http://java.sun.com/j2se/1.5.0/docs/guide/language/generics.html
Werd ich mir angucken.
Danke
cu,
Andreas
Hallo,
Eclipse wirft mir Warnungen, die ich leider nicht wegbekomme:
Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<MyFirstType>
Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<MySecondType>
Nicht Eclipse, der JavaCompiler tut das ;-).
Die Ursache ist mir auch klar.
Ja. Was die Warung beim expilziten Typecasting soll, verstehe ich aber auch nicht. Das konnte mir auch noch niemand richtig erklären.
Bekomme ich also die Warnungen irgendwie weg, ohne von Vector<MyFirstType> und Vector<MySecondType> auf Vector umstellen zu müssen?
Soweit ich weiß, nein. Siehe auch http://java.sun.com/docs/books/tutorial/extra/generics/legacy.html.
Und ohne ein explizites Umkopieren ...
Eben das ist aber "Die Lösung", die in http://forum.java.sun.com/thread.jspa?threadID=611235&messageID=3362234 angeboten wird. Wobei mir nicht klar wird, was daran "quite clever" sein soll.
viele Grüße
Axel
Hi,
Hallo,
Eclipse wirft mir Warnungen, die ich leider nicht wegbekomme:
Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<MyFirstType>
Type safety: The expression of type Vector needs unchecked conversion to conform to Vector<MySecondType>
Nicht Eclipse, der JavaCompiler tut das ;-).
Nö, Eclipse tut das. Ob Eclipse die vom Compiler hat oder sonstwoher, ist mir doch egal ;-)
Die Ursache ist mir auch klar.
Ja. Was die Warung beim expilziten Typecasting soll, verstehe ich aber auch nicht. Das konnte mir auch noch niemand richtig erklären.
dito ...
Bekomme ich also die Warnungen irgendwie weg, ohne von Vector<MyFirstType> und Vector<MySecondType> auf Vector umstellen zu müssen?
Soweit ich weiß, nein. Siehe auch http://java.sun.com/docs/books/tutorial/extra/generics/legacy.html.
Werd ich mir auch angucken.
Und ohne ein explizites Umkopieren ...
Eben das ist aber "Die Lösung", die in http://forum.java.sun.com/thread.jspa?threadID=611235&messageID=3362234 angeboten wird. Wobei mir nicht klar wird, was daran "quite clever" sein soll.
Daß dadurch implizit der nächste Lauf des Garbage Collectors näherrückt ... ;-)
cu,
Andreas
Hallo,
Nö, Eclipse tut das. Ob Eclipse die vom Compiler hat oder sonstwoher, ist mir doch egal ;-)
Der Vollständigkeit halber:
Eclipse hat einen eigenen Compiler. Der JDK-Compiler wird nicht verwendet.
Daher kann man auch Eclipse vollwertig verwenden, wenn man nur das JRE
installiert hat, bei dem ja kein Compiler dabei ist. (Dafür hat man dann
halt auch keinen Source-Code beim JRE dabei, was in Eclipse Konfigurations-
Aufwand bedeutet, wenn man JavaDoc und Parameternamen als Tooltip
sehen will.)
Die Warnungen sind wieder ein anderes Themen. Die kommen vom Java-Plugin
(JDT) von Eclipse selbst. Man könnte die jetzt dem Eclipse-Compiler zuordnen.
Das muß aber nicht sein, weil die Warnings schon während dem Tippen
angezeigt werden und dafür nicht wirklich ein Compilevorgang in dem
Sinne durchgeführt wird, daß ein Kompilat dabei herausfällt. (Obwohl
intern sicherlich derselbe Code wie beim Kompilieren um Einsatz kommt.)
Gruß
Slyh
Hallo MudGuard,
Die Funktion (leider nicht unter meiner Kontrolle ...) liefert immer einen Vector, nicht einen Vector<MyFirstType> oder Vector<MySecondType>, obwohl je nach Aufruf immer nur Objekte des einen oder des anderen Typs darin enthalten sein können (die Klasse wird als Parameter übergeben.
[...]
Bekomme ich also die Warnungen irgendwie weg, ohne von Vector<MyFirstType> und Vector<MySecondType> auf Vector umstellen zu müssen?
Und ohne ein explizites Umkopieren ...
Die beste Lösung wäre, wenn du den Urheber bitten würdest, die Funktion (inklusive Rückgabetyp) auf Generics anzupassen.
So sollte der Rückgabetyp "Vector<T>" sein, und T wird über das Argument der Methode gewählt.
Wenn der Urheber nicht gewillt ist dies zu ändern bleibt dir eventuell noch die Möglichkeit durch den Annotation Type "SupressWarnings" (siehe auch "Java ist auch eine Insel").
Grüße
Marc Reichelt || http://www.marcreichelt.de/
Hallo,
Wenn der Urheber nicht gewillt ist dies zu ändern bleibt dir eventuell noch die Möglichkeit durch den Annotation Type "SupressWarnings" (siehe auch "Java ist auch eine Insel").
Das sollte Eclipse übrigens auch als Quick-Fix anbieten, wenn man in der
Zeile des Fehlers mal Strg+1 drückt.
Gruß
Slyh
Hallo,
Also
Vector<MyFirstType> mftv = someObject.call(MyFirstType.class);
Vector<MySecondType> mstv = someObject.call(MySecondType.class);Es ist also sichergestellt, daß alle Objekte im Vektor jeweils den richtigen Typ haben.
Nein, ist es nicht. Die Methode call() kann natürlich nachwievor jede
Art von Objekt in den Vektor reinpacken. Nur weil da jetzt als Parameter
ein Typ übergeben wird, heißt das ja nicht, daß nur genau immer dieser
Typ in den Vektor abgelegt wird.
Ergo muß die Warnung erscheinen, da eine so tiefgreifende statische
Code-Analyse, die genau erkennen würde, daß wirklich nur Daten vom
übergebenen Typ in den Vector eingefügt werden, gar nicht (ohne weiteres)
möglich ist.
Gruß
Slyh
Hi,
Es ist also sichergestellt, daß alle Objekte im Vektor jeweils den richtigen Typ haben.
Nein, ist es nicht.
Doch, es ist. Vom Hersteller der Methode gibt es die Zusicherung, daß als Returnwert null, ein leerer Vector oder ein Vector gefüllt mit Objekten der übergebenen Klasse kommt und sonst nicht.
cu,
Andreas
Hallo,
Es ist also sichergestellt, daß alle Objekte im Vektor jeweils den richtigen Typ haben.
Nein, ist es nicht.Doch, es ist. Vom Hersteller der Methode gibt es die Zusicherung, daß als Returnwert null, ein leerer Vector oder ein Vector gefüllt mit Objekten der übergebenen Klasse kommt und sonst nicht.
Das Problem ist, dass ein Kompiler davon herzlich wenig weiss und so muss er quasi jammern.
Grüße
Thomas
Hallo,
Das Problem ist, dass ein Kompiler davon herzlich wenig weiss und so muss er quasi jammern.
Ja, beim Methoden-Rückgabewert ist das verständlich. Warum aber die Warnung beim expliziten Typecast? Beim Typecast sollte doch der Compiler beim Kompilieren prüfen, ob so ein Cast möglich ist und wenn ja, dann die entspechende Casting-Routine einsetzen, die _sicherstellt_, das der Cast gelingt. Was genau ist also der Sinn der Warnung bei:
Vector<MyFirstType> mftv = (Vector<MyFirstType>) someObject.call(MyFirstType.class);
?
Die Methode someObject.call(MyFirstType.class) liefert ein Vector-Object. Nach Generics ein Vector<Object> oder ein Vector<?>. Dieses wird explizit in ein Vector<MyFirstType> gecastet. Die Warnung kann man ja nur so verstehen: Hey, meine Casting-Routine ist so unzulänglich, dass sie nicht sicherstellen kann, dass wirlich ein Vector<MyFirstType> entsteht. Ist das so? Wenn ja, warum ist das so? Außer beim Casing in String-Objects (jedes Objekt hat eine .toString()-representation) müssten solche Warnings dann doch auch bei andern Casts kommen z.B. (AbstractDocument) in.readObject() beim Deserialisieren.
viele Grüße
Axel
Hallo,
Das Problem ist, dass ein Kompiler davon herzlich wenig weiss und so muss er quasi jammern.
Ja, beim Methoden-Rückgabewert ist das verständlich. Warum aber die Warnung beim expliziten Typecast? Beim Typecast sollte doch der Compiler beim Kompilieren prüfen, ob so ein Cast möglich ist und wenn ja, dann die entspechende Casting-Routine einsetzen, die _sicherstellt_, das der Cast gelingt. Was genau ist also der Sinn der Warnung bei:Vector<MyFirstType> mftv = (Vector<MyFirstType>) someObject.call(MyFirstType.class);
?
Du meinst damit die Warnung "Type safety: The cast from Vector to Vector<MyFirstType> is actually checking against the erased type Vector"?
Die Methode someObject.call(MyFirstType.class) liefert ein Vector-Object. Nach Generics ein Vector<Object> oder ein Vector<?>. Dieses wird explizit in ein Vector<MyFirstType> gecastet. Die Warnung kann man ja nur so verstehen: Hey, meine Casting-Routine ist so unzulänglich, dass sie nicht sicherstellen kann, dass wirlich ein Vector<MyFirstType> entsteht. Ist das so? Wenn ja, warum ist das so? Außer beim Casing in String-Objects (jedes Objekt hat eine .toString()-representation) müssten solche Warnings dann doch auch bei andern Casts kommen z.B. (AbstractDocument) in.readObject() beim Deserialisieren.
So weit ich das verstehe, gibt es einen Unterschied zwischen der Zeit der Kompilierung, wo generische Typen vollständig vorhanden sind, und der Zeit der Ausführung, wo der Unterschied der generischen Typen nicht mehr gegeben ist.
Eine bessere Erklärung ist vielleicht http://www.velocityreviews.com/forums/showpost.php?p=1924646&postcount=4
Grüße
Thomas
Hallo,
Du meinst damit die Warnung "Type safety: The cast from Vector to Vector<MyFirstType> is actually checking against the erased type Vector"?
Ja, genau. Ein Teufelskreis ;-).
So weit ich das verstehe, gibt es einen Unterschied zwischen der Zeit der Kompilierung, wo generische Typen vollständig vorhanden sind, und der Zeit der Ausführung, wo der Unterschied der generischen Typen nicht mehr gegeben ist.
Eine bessere Erklärung ist vielleicht http://www.velocityreviews.com/forums/showpost.php?p=1924646&postcount=4
Ah, jetzt ja ;-). Man muss allerdings den ganzen Thread lesen, um auch den Verweis auf http://www.angelikalanger.com/GenericsFAQ/FAQSections/ProgrammingIdioms.html zu finden.
Es ist also genau andreasrum, als ich dachte. Offensichtlich gibt es gar keine Casting-Routine, die sicher in Collection<E> casten kann, weil es zur Laufzeit gar keine Collection<E> mehr gibt, sondern aus Kompatibilitätsgründen nur, wie gehabt, eine Collection. Die Generics bieten also den zusätzlichen Informationsgewinn zur Typsicherheit nur _bis_ zum Compilieren. Im Bytecode sind sie gar nicht mehr vorhanden.
viele Grüße
Axel