webentwicklung-frage-antwort-db.com.de

ClassCastException, Umwandlung von Integer in Double

ArrayList marks = new ArrayList();
Double sum = 0.0;
sum = ((Double)marks.get(i));

Bei jedem Versuch, mein Programm auszuführen, erhalte ich eine ClassCastException, die besagt: Java.lang.Integer kann nicht in Java.lang.Double umgewandelt werden

35
Khuba

Wir können eine int in eine double umwandeln, aber wir können nicht dasselbe mit den Wrapper-Klassen Integer und Double tun:

 int     a = 1;
 Integer b = 1;   // inboxing, requires Java 1.5+

 double  c = (double) a;   // OK
 Double  d = (Double) b;   // No way.

Dies zeigt den Kompilierzeitfehler an, der Ihrer Laufzeitausnahme entspricht.

49
Andreas_D

Nun, der Code, den Sie gezeigt haben, enthält nicht das Hinzufügen von Ganzzahlen zu ArrayList - aber wenn Sie do wissen, dass Sie Ganzzahlen haben, können Sie Folgendes verwenden:

sum = (double) ((Integer) marks.get(i)).intValue();

Dadurch wird es in ein int konvertiert, das dann in double konvertiert werden kann. Sie können nicht einfach direkt zwischen den Boxklassen wechseln.

Beachten Sie, dass Ihr Code klarer ist, wenn Sie möglicherweise Generika für Ihr ArrayList verwenden können.

32
Jon Skeet

Der in der Frage veröffentlichte Code ist offensichtlich kein vollständiges Beispiel (er fügt der Arrayliste nichts hinzu, definiert i nirgends).

Wie andere bereits gesagt haben, müssen Sie den Unterschied zwischen primitiven Typen und den Klassentypen verstehen, die sie einrahmen. Z.B. Integer-Boxen int, Double-Boxen double, Long-Boxen long und so weiter. Java automatisch Boxen und Unboxes in verschiedenen Szenarien (früher mussten Sie bei Bibliotheksaufrufen manuell ein- und ausboxen, was jedoch als hässliche PITA angesehen wurde). 

http://docs.Oracle.com/javase/tutorial/Java/data/autoboxing.html

Sie können meistens von einem primitiven Typ in einen anderen umwandeln (die Ausnahme ist boolean), Sie können jedoch nicht dasselbe für geschachtelte Typen tun. Einen geschachtelten Typ in einen anderen umzuwandeln ist etwas komplexer. Vor allem, wenn Sie die Box nicht im Voraus kennen. Normalerweise werden Konvertierungen über einen oder mehrere primitive Typen vorgenommen.

Die Antwort auf Ihre Frage hängt also davon ab, was sich in Ihrer Arrayliste befindet. Ob es sich dabei nur um Objekte des Typs Integer handelt, die Sie ausführen können.

sum = ((double)(int)marks.get(i));

Die Umwandlung in int wird hinter den Kulissen zuerst das Ergebnis von marks.get in Integer umwandeln, dann wird diese Ganzzahl aufgehoben. Wir verwenden dann einen anderen Cast, um das Primitiv int in ein Primitiv double umzuwandeln. Schließlich wird das Ergebnis automatisch in eine Double zurückgegeben, wenn es der Summenvariablen zugewiesen wird. (Angenommen, es wäre wahrscheinlich sinnvoller, wenn sum in den meisten Fällen double und nicht Double ist).

Wenn Ihre Arrayliste eine Mischung von Typen enthält, die jedoch alle die Number-Schnittstelle implementieren (Integer, Short, Long, Float und Double, aber nicht Character und Boolean), können Sie dies tun.

sum = ((Number)marks.get(i)).doubleValue();

Wenn der Mix auch andere Typen enthält, müssen Sie möglicherweise den Operator instanceof verwenden, um sie zu identifizieren und geeignete Maßnahmen zu ergreifen.

9
Peter Green

2 Dinge, die hier zu verstehen sind -

1) Wenn Sie Primitive interger in Primitive double umwandeln. Es klappt. z.B. Es funktioniert gut.

int pri=12; System.out.println((double)pri);

2) Wenn Sie versuchen, ein Integer -Objekt in ein Double -Objekt umzuwandeln oder umgekehrt, schlägt dies fehl.

Integer a = 1; Double b = (double) a; // WRONG. Fails with class cast excptn

Lösung -

Soln 1) Integer i = 1; Double b = new Double(i);
soln 2) Double d = 2.0; Integer x = d.intValue();
7
sapy

geben Sie Ihre Noten an: 

List<Double> marks = new ArrayList<Double>();

Dies nennt man Generika.

5
Vladimir Ivanov

Eine Ganzzahl in ein Double ändern

int abc=12; //setting up integer "abc"

System.out.println((double)abc); 

Der Code gibt die Ganzzahl "abc" als Double aus, was bedeutet, dass er als "12.0" angezeigt wird. Beachten Sie, dass es eine Dezimalstelle gibt, die angibt, dass diese Präzisionsziffer gespeichert wurde.

Gleiches gilt für double, wenn Sie es wieder ändern möchten.

double number=13.94;

System.out.println((int)number); 

Dieser Code wird in einer Zeile gedruckt, "number" als Ganzzahl. Die Ausgabe lautet "13". Beachten Sie, dass der Wert nicht aufgerundet wurde. Die Daten wurden tatsächlich weggelassen.

3
BOb B.
sum = Double.parseDouble(""+marks.get(i));
2
total_chaos

Dies bedeutet, dass Ihre ArrayList in einigen Elementen Ganzzahlen enthält. Das Casting sollte funktionieren, sofern in einem Ihrer Elemente keine ganze Zahl enthalten ist. 

Eine Möglichkeit, um sicherzustellen, dass Ihre Arrayliste keine Ganzzahlen hat, besteht darin, sie als Doubles-Array zu deklarieren.

    ArrayList<Double> marks = new ArrayList<Double>();
0
user2333258
Integer x=10;
Double y = x.doubleValue();
0
vimal chaudhary

Ich denke, das Hauptproblem ist, dass Sie mit der Wrapper-Klasse arbeiten, es scheint, dass es sich um inkompatible Typen handelt. 

Aber ein anderes Problem ist, dass "i" ein int ist, also gibst du das Endergebnis aus und du solltest auch i gießen. Verwenden Sie auch das Schlüsselwort "double", um die Wrapperklasse "cast" und nicht "double" zu konvertieren.

Sie können hier nachschauen: 

Hoffe das hilft. Ich fand den Thread nützlich, aber ich denke, das hilft, ihn weiter zu verdeutlichen.

0
palmaone