List<Integer> ist List<Double> ?

BrknDevee

Mitglied
Java:
List<Integer> positions = (ArrayList<Integer>) doc.get("packetPosition");

System.out.println(positions.get(0));
System.out.println((int)positions.get(0));      // java.lang.ClassCastException: java.base/java.lang.Double cannot be cast to java.base/java.lang.Integer

Es wird folgendes ausgegeben:
2.0
..ClassCastException...

positions scheint, obwohl es zu einer ArrayList<Integer> gecastet wird, eine List<Double> zu sein. Und da man Double nicht zu int casten kann, gibt es eine Exception, es sieht aber mit Integer auch nicht besser aus.

Die eigentlichen Daten werden aus einer MongoDB Datenbank geholt, aber da es zu einer ArrayList gecastet wird, scheint das auch nicht der Fehler zu sein.
Ich bin gerade maximal verwirrt :/
MfG BrknDevee
 

BrknDevee

Mitglied
Hm, okay, ich hatte beim Eintrag in die DB noch Double geschrieben, nur stand 2 statt 2.0 drin. Danke :)
Ich habe aber noch nicht ganz verstanden, warum Java den Cast ignoriert
 

JCODA

Top Contributor
Ich vermute doc.get liefert eine ArrayList ohne Typ zurück, dann kann man sogar so etwas machen:
Java:
import java.util.List;
import java.util.ArrayList;
class House{}
class Main {
  public static void main(String[] args) {
    List objs = new ArrayList();
    objs.add(new House());
    objs.add(new Double(5.0));
    objs.add(new Object());
    List<Integer> integers = (List<Integer>)objs;
    System.out.println(integers);
  }
}
Zur Laufzeit werden alle Informationen über Generics entfernt und nur noch mit "Object" gearbeitet.

In obigem Code wird die untypisierte ArrayList zu einer typisierten gecastet, der Typ "List" bzw bei dir "ArrayList" wird überprüft, aber da zuvor kein Typ angegeben war, kann der Typ hier nicht (beim Compilen) verglichen werden. Soetwas wie "Ich überprüfen jedes Objekt, ob es den richtigen Typ hat beim Casten einer Liste" gibt es in Java leider nicht, zumindest nicht meines Wissens. (Hierfür würde man eine Methode benötigen, die aufgerufen wird, wenn die eigne Klasse mit Generic gecastet wird.)

EDIT: Aber normalerweise sollte bei so einem Standard-Typ dein DB-Framework den richtigen Typ liefern können, vllt. indem du ihn angibst.
 

stg

Top Contributor
Ich habe aber noch nicht ganz verstanden, warum Java den Cast ignoriert

Da wird nichts ignoriert.

Ich vermute der generische Cast hat zur Laufzeit keine Bedeutung,
Ganz recht, zur Laufzeit "gibt es die generics quasi nicht mehr". Das type erasure bereits stattgefunden und für die JVM bleibt da einfach nur ein Cast von ArrayList nach List übrig.

Grundsätzlich sollte man nur casten, wenn man sich über den Typ, den man erhält, auch im Klaren ist.
 

Neue Themen


Oben