L'erreur est plus complexe que vous penseriez d'abord, parce qu'il est en fait l'opérateur « + » qui provoque la « perte possible d'erreur de précision ». L'erreur peut être résolu si la distribution est déplacé:
s[i] = (char)('A' + (num[i]- 1));
Explication
Dans la première liste à puces de §5.6.2 Binary Numeric Promotion dans le Java Language Specification il est dit que:
Lorsqu'un opérateur applique promotion numérique binaire à une paire d'opérandes [...] les règles suivantes s'appliquent, dans l'ordre, en utilisant la conversion d'élargissement (§5.1.2) pour convertir les opérandes selon les besoins:
- Si l'un des opérandes est d'un type de référence, la conversion d'unboxing (§5.1.8) est effectuée. Puis:
- Si l'un des opérandes est de type double, l'autre est converti en double.
- Sinon, si l'un des opérandes est de type float, l'autre est converti en float.
- Sinon, si l'un des opérandes est de type long, l'autre est converti en long.
- Sinon, les deux opérandes sont convertis en type int.
Dans la prochaine liste à puces, il est dit que:
promotion numérique binaire est exécutée sur les opérandes de certains opérateurs:
- Les opérateurs multiplicatifs *,/et% (§15.17)
- Les opérateurs d'addition et de soustraction pour les types numériques + et - (§15.18.2)
- Les opérateurs de comparaison numériques, et> = (§15.20.1)
- Les opérateurs d'égalité numérique == et! = (§15.21.1)
- Les opérateurs de bits au niveau entier &,^et | (§15.22.1)
- Dans certains cas, l'opérateur conditionnel? : (§15.25)
Dans votre cas, cela se traduit par:
s[i] = (int)'A' + (int)((char)(num[i] - (int)1));
donc l'erreur.
Il est dit erreur de perte de précision car un int peut contenir un nombre plus grand qu'un caractère. Vous pouvez donc lancer n'importe quel personnage dans un int, mais la partie supérieure des ints est trop grande pour être convertie en personnage. – Joel