Почему я могу присвоить int переменной char без явного приведения? - PullRequest
7 голосов
/ 04 сентября 2011

Я хотел знать, почему этот фрагмент работает.

char ch1;
ch1 = 'a' + 1;
System.out.println(ch1);

В строке 2 правая часть не переводится в int, а затем для присвоения int char,Разве нам не понадобится явное приведение?

Точно так же я понимаю, что происходит, когда вы делаете ch1 = 65.Но поскольку в Java не разрешено автоматическое преобразование типа down, нам не нужно явное приведение от int к char?

Ответы [ 2 ]

10 голосов
/ 04 сентября 2011

Поскольку Спецификация языка Java говорит:

Кроме того, если выражение является константным выражением (§15.28) типа byte, short, char или int:

Может использоваться сужающее примитивное преобразование, если тип переменной - byte, short или char, а значение константного выражения представлено в типе переменной.

Таким образом, вы правы в том, что выражение повышено до int, но, поскольку оно является константным выражением, приведение не является необходимым.Если бы она включала переменную (или ее значение не вписывалось в char), она была бы другой.

Для такого рода вопросов лучше всего сразу взглянуть на спецификацию языка, поскольку она является авторитетнойисходник и вполне читабельный для спецификации.

3 голосов
/ 04 сентября 2011

Я сейчас использую Eclipse. Следует отметить две вещи:

  • Компилятор проверяет границы во время инициализации.
  • Компилятор вычисляет значения константных выражений, таких как 3 * (2 + 1).

Это работает:

byte b = 127; // works, range of a byte is [-128, 127]

Но это не так:

byte b = 128; // does not work, outside of range

Это работает:

byte b = 100 + -228; // works, 100 + -228 = -128

Но это не так:

byte b = 1;
byte c = b + 1; // does not work, why not?

И это тоже не так:

byte b = 1;
byte c = b + (byte) 1; // does not work, why not?

Обратите внимание, что b является переменным выражением. Если используется переменное выражение, результат оператора + будет по крайней мере равным int . Следовательно, вы не можете присвоить его c. В отличие от константных выражений, компилятор не вычисляет переменные выражения.

Компилятор также будет жаловаться на short и char - попробуйте сами.

И, наконец, использование final для переменной эффективно превращает ее в константное выражение, поэтому это будет работать:

final byte b = 1;
byte c = b + 1; // works
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...