Ошибка компилятора при выполнении приведения типов в Java - PullRequest
4 голосов
/ 25 декабря 2011

Давайте рассмотрим следующие выражения в Java.

int temp = -254;
Integer temp2 = (Integer) temp;        // compiles because of autoboxing

Integer temp3 = (Integer) -254;       // doesn't compile - illegal start of type.
Integer temp4 = (Integer) 10-254;     // compiles

Integer temp5 = (Integer) (int) -254; // compiles
Integer temp6 = -254;                 // compiles
Integer temp7 = (int) -254;           // compiles

В вышеприведенных выражениях почему эти выражения (Integer) 10-254 и (int) -254 допустимы, тогда как выражение (Integer) -254 не компилируется, даже есликонстанта -254 может быть отлично оценена до Integer?

Ответы [ 2 ]

4 голосов
/ 25 декабря 2011

Это интересный крайний случай, компилятор пытается выполнить целочисленное вычитание для класса Integer и литерала int (254).

Обратите внимание, что следующее компилируется и является более явным:

    Integer temp3 = (Integer)(-254)
3 голосов
/ 25 декабря 2011

В частности, это соответствует разделу 15.16 третьего издания JLS :

Приведенное выражение преобразует во время выполнения значение одного числового типа. аналогичному значению другого числового типа; или подтверждает при компиляции время, что тип выражения является логическим; или проверки, при запуске время, что ссылочное значение относится к объекту, чей класс совместим с указанным справочным типом.

CastExpression:
(PrimitiveType Dimsopt) UnaryExpression
(ReferenceType) UnaryExpressionNotPlusMinus

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...