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.
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.
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.
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.
précisez vos marques:
List<Double> marks = new ArrayList<Double>();
Ceci s'appelle des génériques.
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.
sum = Double.parseDouble(""+marks.get(i));
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>();
Integer x=10;
Double y = x.doubleValue();
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.