Преобразование между символом и 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. Надеюсь, в этом есть смысл.