Продвижение типа 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 ответа:
Может ли переменная ниже (называемая 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
были окончательными, вы могли бы сделать это, если бы компиляция могла встроить значение.