Welche Bedeutung hat die Typsicherheitswarnung in bestimmten Java-Generika-Umwandlungen?
-
08-06-2019 - |
Frage
Was bedeutet das Java-Warnung?
Typensicherheit:Die Umwandlung von Object in List<Integer> prüft tatsächlich anhand des gelöschten Typs List
Ich erhalte diese Warnung, wenn ich versuche, ein Objekt in einen Typ mit generischen Informationen umzuwandeln, wie im folgenden Code:
Object object = getMyList();
List<Integer> list = (List<Integer>) object;
Lösung
Diese Warnung tritt auf, weil Java zur Laufzeit keine Typinformationen in einem Objekt speichert, das Generika verwendet.Also, wenn object
ist eigentlich ein List<String>
, es wird kein geben ClassCastException
zur Laufzeit, außer bis auf ein Element aus der Liste zugegriffen wird, das nicht mit dem in der Variablen definierten generischen Typ übereinstimmt.
Dies kann zu weiteren Komplikationen führen, wenn Elemente mit diesen falschen generischen Typinformationen zur Liste hinzugefügt werden.Jeder Code, der noch einen Verweis auf die Liste, aber mit den korrekten generischen Typinformationen enthält, weist nun eine inkonsistente Liste auf.
Um die Warnung zu entfernen, versuchen Sie Folgendes:
List<?> list = (List<?>) object;
Beachten Sie jedoch, dass Sie bestimmte Methoden wie „add“ nicht verwenden können, da der Compiler nicht weiß, ob Sie versuchen, ein Objekt vom falschen Typ hinzuzufügen.Das Obige wird in vielen Situationen funktionieren, aber wenn Sie add oder eine ähnlich eingeschränkte Methode verwenden müssen, müssen Sie nur die gelbe Unterstreichung in Eclipse (oder einer anderen) ertragen SuppressWarning
Anmerkung).