Продвижение типа Java с " выражениями"


Может ли переменная ниже (называемая b) называться выражением, если она является единственной вещью, расположенной справа от знака равенства?

// This code fragment will not compile.
// c is a char, and b is a byte.

c = b;

Причина, по которой я задаю этот вопрос, связана с темой продвижения типа в выражениях. Я понимаю, что Java продвигает все байты в ints. Это единственная причина, по которой этот фрагмент кода не компилируется? (Пожалуйста, обратите внимание, что я знаю о бросках; это не суть этой темы. Большое спасибо.)

Редактировать: Большое спасибо Джон и Питер. Рассмотрим эту тему на втором примере:

byte b = 1;
short s = 2;

s = b;  // OK
s = b*2;  // Not OK (compilation error)
Правда ли, что происходит следующее?

(строка 3) Java преобразует байт в short. (Строка 4) Java преобразует выражение b*2 в int.

Если это верно, то может показаться, что =b; и =b*2; являются "выражениями", которые Java обрабатывает по-разному. Таким образом, выражение =b; не преобразуется в int, а расширяется до short. Но выражение =b*2; преобразуется в int, а не в short, даже хотя целевая переменная, называемая s, является короткой.

Правка 2: Также -

short s1, s2 = 2, s3 = 2;
s1 = s2*s3;  // Not OK (compilation error)

Несмотря на то, что все три переменные являются короткими, выражение s2*s3; повышается до int и, таким образом, вызывает ошибку компиляции.

2 2

2 ответа:

Может ли переменная ниже (называемая b) называться выражением, если она является единственной вещью, расположенной справа от знака равенства?

Да, безусловно.

Я понимаю, что Java продвигает все байты к ints.

Ну, в некоторых случаях. Не в все случаях.

Принципиально код не компилируется, потому что нет неявного преобразования из byte в char. Из раздела 5.1.2 JLS (расширяющий примитив преобразования):

19 специфические преобразования на примитивных типах называются расширяющимися примитивными преобразованиями:
  • byte к short, int, long, float, или double
  • ...
Обратите внимание на отсутствие char в списке целевых типов для преобразований из byte.

Попробуйте это

byte b = -1;
short s = b; // is ok as a byte can be promoted to an short.
int i = b; // is ok as a byte can be promoted to an int.
float f = b; // is ok as a byte can be promoted to an float, long or double.

char c = b; // won't compile

Но

final byte b = 1;
char c = b; // compiles fine as the compiler can inline the value.

В данном случае

short s = b*2;  // Not OK (compilation error)

B * 2 - это int, как 2 - это int Значение. Если бы b были окончательными, вы могли бы сделать это, если бы компиляция могла встроить значение.