Это на самом деле не имеет ничего общего с упаковкой или распаковкой.
Когда вы применяете арифметическую операцию к char
, она преобразуется в int
согласно JLS §5.6.2 :
Расширяющее примитивное преобразование (§5.1.2) применяется для преобразования одного или обоих операндов, как указано в следующих правилах:
- Если один из операндов имеет тип
double
, другой преобразуется в double
. - В противном случае, если один из операндов имеет тип
float
, другой преобразуется в float
. - В противном случае, если один из операндов имеет тип
long
, другойпреобразуется в long
. - В противном случае оба операнда преобразуются в тип
int
.
Таким образом, i - 1
не являетсяchar
, но int
.И поскольку в ваших charSet
нет Integer
(только Character
s), удалить нечего.Если бы вы разыграли i - 1
до char
, вы бы получили ожидаемый результат.