Целое число в байтах не компилируется - PullRequest
6 голосов
/ 25 января 2020

У меня есть две программы, которые почти идентичны. Первый компилируется, второй нет. Почему?

Я присваиваю переменную int переменной byte.

Этот файл компилируется:

class Example {
    public static void main(String args[]) {
        final int x = 127; // directly initialized

        byte b;
        b = x;

        System.out.println(b);
    }
}

Этот файл не компилируется:

class Example {
    public static void main(String args[]) {
        final int x;
        x = 127; // assigned later

        byte b;
        b = x;

        System.out.println(b);
    }
}

Компилятор сообщает несовместимые типы при b = x;. Но разве это не должно относиться и к первой версии?

1 Ответ

9 голосов
/ 25 января 2020

Это неясно. Действительно неясен.

Первая версия работает, потому что JLS говорит в разделе §5.2 , что вы можете присвоить значение int переменной byte, если значение является результатом константа И значение int находится в диапазоне от -128 до +127. постоянная переменная является постоянным выражением , а final int x = 127; объявляет постоянную переменную .

Вторая версия не работает, поскольку final int x; не объявляет постоянную переменную . JLS сообщает следующее в разделе §4.12.4 :

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

Во второй версии конечная переменная имеет пустой инициализатор и затем присваивается позже. В результате правило 5.5, допускающее сужение примитивных констант в присваивании, не допускается.


Почему final int x; не может рассматриваться как постоянная времени компиляции?

Примите во внимание следующее:

    final int x;
    if (something) {
        x = 127;
    } else {
        x = 1023;
    }
    byte b = x;

Следует ли разрешить инициализацию b или это будет преобразование с потерями? Это зависит от значения something.

Гипотетически, компилятор может решить в некоторых вариантах приведенного выше примера, что все возможные значения x будут в порядке, но сложность в компиляторе и спецификации языка не оправданный.

...