Ошибка более сложная, чем вы могли подумать, потому что на самом деле это оператор «+», который вызывает «возможную потерю точности».
Ошибка может быть устранена, если приведение приведено в действие:
s[i] = (char)('A' + (num[i]- 1));
Объяснение
В первом маркированном списке §5.6.2 двоичного числового продвижения в Спецификации языка Java указано, что:
Когда оператор применяет двоичное числовое продвижение к паре операндов [...], применяются следующие правила в порядке использования расширяющегося преобразования (§5.1.2) для преобразования операндов по мере необходимости:
- Если какой-либо из операндов относится к ссылочному типу, выполняется преобразование без распаковки (§5.1.8). Тогда:
- Если один из операндов имеет тип double, другой преобразуется в двойной.
- В противном случае, если один из операндов имеет тип float, другой преобразуется в float.
- В противном случае, если один из операндов имеет тип long, другой преобразуется в long.
- В противном случае оба операнда преобразуются в тип int.
В следующем списке обозначено, что:
Двоичное числовое продвижение выполняется над операндами некоторых операторов:
- Мультипликативные операторы *, / и% (§15.17)
- Операторы сложения и вычитания для числовых типов + и - (§15.18.2)
- Операторы числового сравнения и> = (§15.20.1)
- Операторы числового равенства == и! = (§15.21.1)
- Целочисленные побитовые операторы &, ^ и | (§15.22.1)
- В каких случаях условный оператор? : (§15.25)
В вашем случае это означает:
s[i] = (int)'A' + (int)((char)(num[i] - (int)1));
отсюда и ошибка.