L'errore è più complesso di quanto si potrebbe inizialmente pensare, perché in realtà è l'operatore '+' che causa la "possibile perdita di errore di precisione". L'errore può essere risolto se il cast è spostato:
s[i] = (char)('A' + (num[i]- 1));
Spiegazione
Nel primo elenco proiettile del §5.6.2 Binary Numeric Promotion nel Java Language Specification si afferma che:
Quando si applica un operatore promozione numerica binaria a una coppia di operandi [...] si applicano le seguenti regole, in ordine, utilizzando la conversione di ampliamento (§5.1.2) per convertire gli operandi come necessario:
- Se uno qualsiasi degli operandi è di un tipo di riferimento, viene eseguita la conversione di unboxing (§5.1.8). Quindi:
- Se uno degli operandi è di tipo double, l'altro viene convertito in double.
- Altrimenti, se uno degli operandi è di tipo float, l'altro viene convertito in float.
- Altrimenti, se uno degli operandi è di tipo lungo, l'altro viene convertito in long.
- In caso contrario, entrambi gli operandi vengono convertiti in tipo int.
Nella prossima lista proiettile si precisa che:
promozione numerico binario viene eseguita su operandi di alcuni operatori:
- Gli operatori moltiplicativi *,/e% (§15.17)
- Gli operatori di addizione e sottrazione per tipi numerici + e - (§15.18.2)
- Gli operatori di confronto numerici, e> = (§15.20.1)
- Operatori di uguaglianza numerica == e! = (§15.21.1)
- Gli operatori bit a bit interi &, ^, and | (§15.22.1)
- In alcuni casi, l'operatore condizionale? : (§15.25)
Nel tuo caso, che si traduce in:
s[i] = (int)'A' + (int)((char)(num[i] - (int)1));
da qui l'errore.
Dice la perdita di errore di precisione perché un int può contenere un numero maggiore di un carattere. Quindi puoi lanciare qualsiasi personaggio su un int, ma la gamma superiore di int è troppo grande per essere lanciata su un personaggio. – Joel