Продвижение на Java?
Правила продвижения по службе - это "когда операнды разных типов, автоматическое двоичное числовое продвижение происходит с меньшим преобразованием типа операнда в большее". Но операнды одного типа, например,
byte=byte+byte // Compile time error... found int..
Так почему это так?
Ответы
Ответ 1
Нет оператора no + для byte
. Вместо этого оба операнда продвигаются до int, поэтому у вас есть
byte = byte + byte
... becomes (widening to find + operator) ...
byte = int + int
... becomes (result of + operator) ...
byte = int
... который затем терпит неудачу, потому что нет никакого неявного преобразования от int
до byte
. Вам нужно бросить:
byte a = 1;
byte b = 2;
byte c = (byte) (a + b);
Вот фактические правила для числовой рекламы, от раздела 5.6.2 JLS:
Когда оператор применяет двоичное числовое продвижение к паре операндов, каждый из которых должен обозначать значение, которое можно конвертировать в числовой тип, применяются следующие правила, с тем чтобы использовать расширенное преобразование (§5.1.2) для преобразования операнды при необходимости:
- Если какой-либо из операндов имеет ссылочный тип, выполняется преобразование распаковки (п. 5.1.8). Тогда:
- Если один из операндов имеет тип double, другой преобразуется в double.
- В противном случае, если любой операнд имеет тип float, другой преобразуется в float.
- В противном случае, если любой из операндов имеет тип long, другой преобразуется в long.
- В противном случае оба операнда преобразуются в тип int.
Ответ 2
Вам был предоставлен правильный ответ об автоматической рекламе на "int".
Есть еще одно замечание: сложные операторы присваивания ведут себя так, как будто они имеют неявный тип. Пример:
byte b1 = 1;
byte b2 = 2;
b1 = b1 + b2; // compilation fails
b1 += b2; // compilation successful
Ответ 3
Из этот вопрос SO и выше ответы, связанные с арифметическим оператором +
, оба операнда преобразуются в тип int
.
byte b1 = 1;
byte b2 = 2;
byte b3 = b1 + b2; // compile time error
В приведенном выше коде значение b1
и b2
будет разрешено во время выполнения, поэтому компилятор преобразует оба значения в int
до разрешения значения.
Но если мы рассмотрим следующий код,
final byte b1 = 1;
final byte b2 = 2;
int b3 = b1 + b2; // constant expression, value resolved at compile time
b1
и b2
являются конечными переменными, и значения будут разрешаться во время компиляции, поэтому компиляция не завершится.
Ответ 4
Я хотел бы поговорить о продвижении в целом
Java может оценивать только арифметические выражения, в которых типы операндов идентичны
Например, в выражении, содержащем значения int и double, значения int повышаются до двойных значений для использования в выражении.
в другом слове
double someVar = 1 / 2;// someVar = 0
но
double someVar = (double)1 / 2;// someVar = 0.5
почему?
- мы используем (double)
cast operator
для создания temporary
с плавающей запятой его операнда "1"
(он называется explicit conversion
)
- Теперь расчет состоит из значения с плавающей запятой (временная двойная копия 1), деленная на целое число 2
- в соответствии с вышеприведенным оператором, Java выполняет операцию под названием
promotion
(или неявное преобразование), поэтому int values
повышается до double values
для использования in
выражение = > целое число 2 повышается до double
- выражение стало
double someVar = 1.0 / 2.0; // someVar= 0.5
надеюсь, что это полезно, даже если это не в центре вопроса