Błąd jest bardziej skomplikowana niż mogłoby się początkowo wydawać, bo to jest rzeczywiście „+” operator „które powoduje, że ewentualne straty błędu precyzji”. Błąd może zostać rozwiązany, jeśli obsada jest przemieszczana:
s[i] = (char)('A' + (num[i]- 1));
Wyjaśnienie
W pierwszym liście pocisku z §5.6.2 Binary Numeric Promotion w Java Language Specification stwierdza się, że:
Kiedy stosuje operator binarna promocja numeryczna do pary operandów [...] stosuje się następujące zasady, w kolejności, używając konwersji rozszerzającej (§5.1.2) do konwersji argumentów w razie potrzeby:
- Jeśli którykolwiek z argumentów jest typu referencyjnego, wykonywana jest konwersja rozpakowywania (§5.1.8). Następnie:
- Jeśli jeden z argumentów jest typu double, drugi jest konwertowany na double.
- W przeciwnym wypadku, jeśli jeden z argumentów jest typu zmiennoprzecinkowego, drugi jest konwertowany na zmienny.
- W przeciwnym wypadku, jeśli jeden z operandów ma typ long, drugi jest konwertowany na long.
- W przeciwnym razie oba operandy są konwertowane na typ int.
W następnym liście pocisku jest powiedziane, że:
Binary promocja numeryczna jest wykonywane na argumentach niektórych operatorów:
- operatorów multiplikatywne *,/i% (§15.17)
- dodawania, odejmowania operatorów dla typów numerycznych + i - (§15.18.2)
- numeryczna operatorów porównania i> = (§15.20.1)
- Operatory równości liczb == i! = (§15.21.1)
- Liczba całkowita operatory bitowe &, ^, i | (§15.22.1)
- W niektórych przypadkach operator warunkowy? : (§15.25)
W twoim przypadku oznacza to:
s[i] = (int)'A' + (int)((char)(num[i] - (int)1));
stąd błąd.
Mówi o błędzie utraty precyzji, ponieważ int może zawierać większą liczbę niż znak. Możesz więc rzucić jakąkolwiek postać do int, ale górny zakres intów jest zbyt duży, by rzucić go na postać. – Joel