Почему явное приведение не требуется здесь?
class MyClass {
void myMethod(byte b) {
System.out.print("myMethod1");
}
public static void main(String [] args) {
MyClass me = new MyClass();
me.myMethod(12);
}
}
Я понимаю, что аргумент myMethod()
является литералом int
, а параметр b
имеет тип байта, этот код генерирует ошибку времени компиляции. (чего можно избежать, используя явный байт для аргумента: myMethod((byte)12)
)
class MyClass{
byte myMethod() {
return 12;
}
public static void main(String [ ] args) {
MyClass me = new MyClass();
me.myMethod();
}
}
После этого я ожидал, что приведенный выше код также сгенерирует ошибку времени компиляции, учитывая, что 12 является литералом int
, а тип возврата myMethod()
- байтом. Но такой ошибки не возникает. (Нет явного приведения: return (byte)12;
)
Спасибо.
Ответы
Ответ 1
Java поддерживает сужение в этом случае. Из Специфика языка Java в отношении преобразования присваивания:
Сужение примитивного преобразования может быть использовано, если тип переменная byte
, short
или char
, а значение константы выражение представляется в типе переменной.
Ответ 2
Из Ссылка на примитивный тип данных Java:
byte: Тип данных байта представляет собой 8-битовое двухзначное целое число. Он имеет минимальное значение -128 и максимальное значение 127 (включительно).
Попробуйте вернуть 128:))
Ответ 3
Это будет работать byte b = 4
, пока значение находится в пределах диапазона, но если вы попробуете что-то вроде byte b = 2000
, вы получите ошибку компилятора, потому что это вне диапазона. 12
находится в пределах диапазона, поэтому вы не получаете ошибку.