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.
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.
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.
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.
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.
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();
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.