Бинарные операторы над символами вызывают преобразования типов в Java?

При работе с числами в формате BCD и, следовательно, со многими бинарными операторами я недавно обнаружил следующее поведение:

При использовании любого бинарного оператора для символа и присвоении его обратно символьной переменной компилятор выдает ошибку несовместимого типа:

public class Test {
    public static void main(String[] args) {
        char c = 0;
        char d = c & 0;
    }
}

Выход:

Test.java:4: error: incompatible types: possible lossy conversion from 
int to char
        char d = c & 0;
                   ^
1 error

Он отлично работает, когда компилятор знает, что значение умещается в 16 бит — следующий пример компилируется просто отлично:

public class Test {
    public static void main(String[] args) {
        char d = 32767 & 0;
    }
}

(работает любое число ниже 2^15). Таким образом, очевидно, что здесь символы неявно преобразуются в целые числа. Это имеет смысл для оператора сдвига влево, но в остальном это действительно раздражает и не имеет для меня никакого смысла.

Почему это происходит и в каком случае это может быть полезно?


person Ferdinand S    schedule 04.03.2019    source источник
comment
Кстати, то же самое касается byte или short.   -  person shmosel    schedule 04.03.2019
comment
См.: Java char также является целым числом?   -  person Jacob G.    schedule 04.03.2019
comment
Вы читали вопрос? Я знаю о неявном преобразовании типов, но не понимаю, почему это должно происходить в данном случае.   -  person Ferdinand S    schedule 05.03.2019