Подтвердить что ты не робот

Продвижение на Java?

Правила продвижения по службе - это "когда операнды разных типов, автоматическое двоичное числовое продвижение происходит с меньшим преобразованием типа операнда в большее". Но операнды одного типа, например,

byte=byte+byte // Compile time error... found int..

Так почему это так?

4b9b3361

Ответ 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

надеюсь, что это полезно, даже если это не в центре вопроса