web-dev-qa-db-fra.com

ClassCastException, attribuant Integer à Double

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

Chaque fois que j'essaie d'exécuter mon programme, une exception ClassCastException se lit: Java.lang.Integer ne peut pas être converti en Java.lang.Double.

35
Khuba

Nous pouvons transtyper une int en une double mais nous ne pouvons pas faire la même chose avec les classes wrapper Integer et Double:

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

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

Cela montre l'erreur de compilation qui correspond à votre exception d'exécution.

49
Andreas_D

Eh bien, le code que vous avez montré n'inclut pas réellement l'ajout d'entiers à la ArrayList - mais si vous faites que vous avez des entiers, vous pouvez utiliser:

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

Cela le convertira en int, qui pourra ensuite être converti en double. Vous ne pouvez pas simplement lancer directement entre les classes encadrées.

Notez que si vous pouvez éventuellement utiliser des génériques pour votre ArrayList, votre code sera plus clair.

29
Jon Skeet

Le code affiché dans la question n'est évidemment pas un exemple complet (cela n'ajoute rien à l'arraylist, il ne définit pas i nulle part).

Tout d’abord, comme d’autres l’ont dit, vous devez comprendre la différence entre les types primitifs et les types de classes qui les encadrent. Par exemple. Integer cases int, Double cases double, Long cases long et ainsi de suite. Java automatiquement des boîtes et des boîtes de réception dans divers scénarios (il fallait l'habitude de boxer et de déballer manuellement avec des appels de bibliothèque, mais cela était considéré comme un vilain PITA). 

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

Vous pouvez principalement transtyper d'un type primitif vers un autre (à l'exception de boolean), mais vous ne pouvez pas faire la même chose pour les types boxed. Convertir un type de boîte en un autre est un peu plus complexe. Surtout si vous ne connaissez pas le type de boîte à l'avance. Habituellement, il faudra convertir via un ou plusieurs types primitifs.

Donc, la réponse à votre question dépend de ce qui se trouve dans votre liste, si ce ne sont que des objets de type Integer, vous pouvez le faire.

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

Le transtypage en int coulera en coulisse d’abord le résultat de marks.get en Integer, puis il décompressera cet entier. Nous utilisons ensuite une autre conversion pour convertir la primitive int en une primitive double. Enfin, le résultat sera automatiquement remplacé par une Double quand il sera affecté à la variable sum. (En revanche, il serait probablement plus logique que somme soit de type double plutôt que Double dans la plupart des cas).

Si votre liste contient plusieurs types mais qu’ils implémentent tous l’interface Number (Integer, Short, Long, Float et Double, tous les caractères sont Caractère et Boolean, alors vous pouvez le faire.

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

S'il existe également d'autres types dans la combinaison, vous devrez peut-être envisager d'utiliser l'opérateur instanceof pour les identifier et prendre les mesures appropriées.

9
Peter Green

précisez vos marques: 

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

Ceci s'appelle des génériques.

5
Vladimir Ivanov

Changer un entier en double

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

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

Le code affichera le nombre entier "abc" sous forme de double, ce qui signifie qu'il affichera "12.0". Notez qu’il existe une décimale indiquant que ce chiffre de précision a été enregistré.

Même chose avec double si vous voulez le changer,

double number=13.94;

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

Ce code sera imprimé sur une ligne, "nombre" en tant qu'entier. La sortie sera "13". Notez que la valeur n'a pas été arrondie, les données ont en fait été omises.

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

Cela signifie que votre ArrayList contient des entiers dans certains éléments. Le casting devrait fonctionner sauf s'il y a un entier dans l'un de vos éléments. 

Une façon de vous assurer que votre liste de contrôle n'a pas d'entiers est de le déclarer comme tableau de Doubles.

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

Je pense que le problème principal est que vous utilisez la classe wrapper, il semble qu’ils soient incompatibles. 

Mais un autre problème est que "i" est un int, vous devez donc lancer le résultat final. Essayez également d’utiliser le mot clé "double" pour lancer et non "double" la classe wrapper.

Vous pouvez vérifier ici: 

J'espère que cela t'aides. J'ai trouvé le fil utile mais je pense que cela aide à le clarifier davantage.

0
palmaone