Преобразование между символом и int в Java

Вы не можете конвертировать из int в char, так что это будет незаконноint i = 88; char c = i;,

Однако это разрешено char c = 88;,

Разве это не просто число и int буквальный? Как это разрешено?

3 ответа

Решение

char фактически является беззнаковым 16-битным целочисленным типом в Java.

Как и другие целочисленные типы, вы можете выполнить преобразование присваивания из целочисленной константы в любой целочисленный тип, если он находится в соответствующем диапазоне. Вот почему

byte b = 10;

тоже работает

Из JLS, раздел 5.2:

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

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

На самом деле, преобразование из int в char законно, просто требует явного приведения, потому что потенциально может потерять данные:

int i = 88; 
char c = (char) i;

Однако, с литералом, компилятор знает, будет ли он вписываться в char без потери данных и только жалуется, когда вы используете литерал, который слишком велик для char:

char c = 70000; // compiler error

Это потому, что литералы для целого или меньшего, чем int, как byte, short и char, являются int. Понять следующее таким образом.

код:

  byte a = 10;//compile fine
  byte b= 11;//compile fine
  byte c = a+b;//compiler error[says that result of **a+b** is **int**]

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

byte c = (byte)(a+b);

Так что по той же причине, по которой значение int должно иметь примитивное приведение, чтобы изменить значение в char. Надеюсь, в этом есть смысл.

Другие вопросы по тегам