54 votes

ClassCastException, convertir Integer en Double

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

Chaque fois que j'essaie d'exécuter mon programme, j'obtiens une ClassCastException qui indique : java.lang.Integer cannot be cast to java.lang.Double.

57voto

Andreas_D Points 64111

Nous pouvons lancer un int à un double mais nous ne pouvons pas faire la même chose avec les classes enveloppes Integer y 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.

37voto

Jon Skeet Points 692016

Le code que vous avez montré n'inclut pas l'ajout de nombres entiers à l'adresse de l'utilisateur. ArrayList - mais si vous faire savoir que vous avez des entiers, vous pouvez utiliser :

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

Cela le convertira en un int qui peut ensuite être converti en double . Vous ne pouvez pas passer directement d'une classe à l'autre.

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

12voto

Peter Green Points 111

Le code affiché dans la question n'est manifestement pas un exemple complet (il n'ajoute rien à la liste de tableaux, il ne définit pas le nom de la liste de tableaux). i n'importe où).

Tout d'abord, comme d'autres l'ont dit, vous devez comprendre la différence entre les types primitifs et les types de classe qui les encadrent. Par exemple Integer boîtes int , Double boîtes double , Long boîtes long et ainsi de suite. Java met automatiquement en boîte et hors boîte dans divers scénarios (il était autrefois nécessaire de mettre en boîte et hors boîte manuellement avec des appels de bibliothèque, mais cela était considéré comme un affreux PITA).

http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

Vous pouvez généralement effectuer des castings d'un type primitif à un autre (à l'exception de boolean ) mais vous ne pouvez pas faire la même chose pour les types de boîtes. La conversion d'un type encadré en un autre est un peu plus complexe. Surtout si vous ne connaissez pas le type de boîte à l'avance. En général, cela implique une conversion via un ou plusieurs types primitifs.

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

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

Le casting pour int va en coulisses d'abord lancer le résultat de marks.get à Integer alors il débloquera cet entier. Nous utilisons ensuite un autre cast pour convertir la primitive int à une primitive double . Enfin, le résultat sera renvoyé en boîte automatique dans un fichier Double lorsqu'il est affecté à la variable somme. (d'ailleurs, il serait probablement plus logique que la somme soit de type double plutôt que Double dans la plupart des cas).

Si votre liste de tableaux contient un mélange de types mais qu'ils implémentent tous la fonction Number (Integer, Short, Long, Float et Double le font, mais pas Character et Boolean), vous pouvez le faire.

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

S'il y a aussi d'autres types de produits dans le mélange, vous devrez peut-être envisager d'utiliser l'outil d'évaluation de la qualité des produits. instanceof opérateur pour les identifier et prendre les mesures appropriées.

8voto

sapy Points 7

2 choses à comprendre ici -

1) Si vous lancez un casting primitif interger à Primitive double . Cela fonctionne. Par exemple Cela fonctionne bien.

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

2) si vous essayez de couler Integer à l'objet Double ou vice versa, il échoue.

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

Solution -

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

5voto

Vladimir Ivanov Points 23731

Précisez vos marques :

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

C'est ce qu'on appelle les génériques.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X