char
в Java является 16 бит без знака значение а, в то время как byte
является 8-битное значение. Допустимый диапазон для байта: [-128, 127]
. Таким образом, не все символы могут быть назначены в byte
.
В своем первом методе вы возвращаете char
с кодовом = 1 ('b' - 'a'
). Теперь, поскольку вы определили char
как final
и присвоили ему постоянное выражение, оно становится постоянной времени компиляции. Таким образом, компилятор не дает ошибок компилятора.
От JLS Section 5.2:
If the expression is a constant expression (§15.28) of type byte, short, char, or int:
- A narrowing primitive conversion may be used if the type of the variable is byte, short, or char, and the value of the constant expression is representable in the type of the variable.
выделено мной.
Однако, если вы сделаете c
неконечное, это также приведет к ошибке компилятора:
static byte m1() { // This will be an error
char c = 'b'-'a';
return c;
}
Причина заключается в том, c
не компилирование постоянной времени больше, и компилятор не делает неявное понижение.
Во втором методе вы возвращаете char
, который вы передали. Параметр c
не имеет постоянной времени компиляции. Во время компиляции неизвестно, какое значение может получить метод. Нравится, если вы передадите char
с кодовыми точками, не входящими в диапазон допустимых значений byte
, это не сработает.
Для того, чтобы 2-й метод работы, вы можете сделать явное приведение:
static byte m3(final char c) {
return (byte)c; // 3
}
Что вы имеете в виду, если не работаете? –
при компиляции: говорит: ошибка: возможная потеря точности – chathura
Возможно статическая оптимизация в методе 1? –