Welche Bedeutung hat die Typensicherheitswarnung in bestimmten Java-Generika-Casts?

74

Was bedeutet die Java-Warnung ?

Typensicherheit: Die Umwandlung von Objekt in Liste <Integer> wird tatsächlich mit der gelöschten Typliste verglichen

Ich erhalte diese Warnung, wenn ich versuche, ein Objekt in einen Typ mit allgemeinen Informationen umzuwandeln, z. B. im folgenden Code:

Object object = getMyList();
List<Integer> list = (List<Integer>) object;
Mike Stone
quelle
1
Wenn Sie die gelbe Unterstreichung in Eclipse entfernen möchten, aber nicht hinzufügen möchten @SuppressWarning, können Sie die Warnung in den Einstellungen ignorieren. Gehen Sie im Einstellungsfenster zu Java> Compiler> Fehler / Warnungen und ändern Sie im Abschnitt Generische Typen die Option Ungeprüfte generische Typoperation in Ignorieren
Axel

Antworten:

52

Diese Warnung ist vorhanden, da Java zur Laufzeit keine Typinformationen in einem Objekt speichert, das Generika verwendet. Wenn objectes sich also tatsächlich um a handelt List<String>, gibt es ClassCastExceptionzur Laufzeit keine, es sei denn, auf ein Element aus der Liste wird zugegriffen, das nicht mit dem in der Variablen definierten generischen Typ übereinstimmt.

Dies kann weitere Komplikationen verursachen, wenn Elemente mit diesen falschen generischen Typinformationen zur Liste hinzugefügt werden. Jeder Code, der noch einen Verweis auf die Liste enthält, aber die richtigen generischen Typinformationen enthält, hat jetzt eine inkonsistente Liste.

Versuchen Sie Folgendes, um die Warnung zu entfernen:

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 funktioniert in vielen Situationen, aber wenn Sie add oder eine ähnlich eingeschränkte Methode verwenden müssen, müssen Sie nur die gelbe Unterstreichung in Eclipse (oder eine SuppressWarningAnmerkung) erleiden .

Mike Stone
quelle