Результатом добавления символов, шортов или байтов Java будет int :
Спецификация языка Java для двоичного числового продвижения :
- Если какой-либо из операндов относится к ссылочному типу, преобразование без распаковки
(§5.1.8) выполняется. Тогда:
- Если любой из операндов имеет тип double,
другой преобразуется в двойной.
- В противном случае, если любой из операндов имеет тип
float, другой преобразуется в float.
- В противном случае, если любой из операндов
имеет тип long, другой преобразуется в long.
- В противном случае оба
операнды преобразуются в тип int.
Но обратите внимание, что говорится об составных операторах присваивания (например, + =) :
Результат двоичной операции преобразуется в тип левой переменной ... и результат преобразования сохраняется в переменной.
Например:
char x = 1, y = 2;
x = x + y; // compile error: "possible loss of precision (found int, required char)"
x = (char)(x + y); // explicit cast back to char; OK
x += y; // compound operation-assignment; also OK
Один из способов выяснить тип результата, как правило, состоит в том, чтобы привести его к объекту и спросить, к какому классу он относится:
System.out.println(((Object)('a' + 'b')).getClass());
// outputs: class java.lang.Integer
Если вы заинтересованы в производительности, обратите внимание, что байт-код Java даже не имеет специальных инструкций для арифметики с меньшими типами данных. Например, для добавления есть инструкции iadd
(для целых), ladd
(для длинных), fadd
(для чисел с плавающей запятой), dadd
(для двойных чисел), и все. Для имитации x += y
с меньшими типами компилятор будет использовать iadd
, а затем обнулять верхние байты int с помощью инструкции, подобной i2c
("int to char"). Если собственный ЦП имеет специальные инструкции для 1-байтовых или 2-байтовых данных, это зависит от виртуальной машины Java, чтобы оптимизировать ее во время выполнения.
Если вы хотите объединить символы в виде строки, а не интерпретировать их как числовой тип, существует множество способов сделать это. Самым простым является добавление пустой строки в выражение, потому что добавление символа и строки приводит к строке. Все эти выражения приводят к строке "ab"
:
'a' + "" + 'b'
"" + 'a' + 'b'
(это работает, потому что "" + 'a'
оценивается первым; если бы ""
было в конце, вместо этого вы бы получили "195"
)
new String(new char[] { 'a', 'b' })
new StringBuilder().append('a').append('b').toString()
String.format("%c%c", 'a', 'b')