Вопрос: Java char to byte casting


Я тестировал кастинг, и я прошел через это:

public class Test {
    public static void main(String a[]) {
        final byte b1 = 1;
        byte b2 = 1;
        char c = 2;

        c = b1; // 1- Working fine
        c = b2; // 2 -Compilation error
    }
}

Может ли кто-нибудь объяснить, почему он работает нормально в 1, когда я добавил финал в байт?


24


источник


Ответы:


Когда переменная final, компилятор автоматически устанавливает значение, равное 1. Это значение представляется как char, то есть:

c = b1;

эквивалентно

c = 1;

Фактически, согласно этот раздел final переменные , b1 рассматривается как константа:

Переменная примитивного типа или типа String, то есть final и инициализируется выражением константы времени компиляции (§15.28), называется постоянная переменная ,


19



Преобразование из byte в char является расширением и сужением примитивного преобразования, как описано в пункт 5.1.4  Спецификации языка Java.

Как описывает JLS, это делается с помощью промежуточного шага; byte преобразуется в int через расширяющееся примитивное преобразование, а затем int преобразуется в char через сужение примитивного преобразования (см. 5.1.3 ).

Пункт 5.2  объясняет, когда бросок необходим, когда вы выполняете задание:

... если выражение является постоянное выражение  ( §15.28 ) типа byte, short, char, или int:

  • Сужение примитивного преобразования может быть использовано, если тип переменной byte, short, или char, а значение константного выражения представляется в типе переменной.

Ваша переменная b1 действительно является константой, но ваша переменная b2 нет, поэтому это правило применяется для b1 но не для b2,

Итак: вы можете назначить b1 в c потому как b1 является константой и значением константы, 1, вписывается в char, но вы не можете назначить b2 в c без броска, потому что b2 не является константой.


10



Ну, потому что байт является подписанным типом, а char - нет, поэтому вам нужно применять явное преобразование типа для (2)

c = (char)b2;

также окончательный оператор работал на 1, поскольку до компиляции компилятор может подтвердить, что нет потерь из-за преобразования, так как «1» находится в диапазоне символов, попробуйте поставить «-1» с тем же заключительным заявлением в ( 1) вы снова получите ошибку компиляции.

Все это сводится к совместимости типов между подписанными и неподписанными типами. Это должно быть сделано явно в java.


0