Подтвердить что ты не робот

Почему явное приведение не требуется здесь?

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;)

Спасибо.

4b9b3361

Ответ 1

Java поддерживает сужение в этом случае. Из Специфика языка Java в отношении преобразования присваивания:

Сужение примитивного преобразования может быть использовано, если тип переменная byte, short или char, а значение константы выражение представляется в типе переменной.

Ответ 2

Из Ссылка на примитивный тип данных Java:

byte: Тип данных байта представляет собой 8-битовое двухзначное целое число. Он имеет минимальное значение -128 и максимальное значение 127 (включительно).

Попробуйте вернуть 128:))

Ответ 3

Это будет работать byte b = 4, пока значение находится в пределах диапазона, но если вы попробуете что-то вроде byte b = 2000, вы получите ошибку компилятора, потому что это вне диапазона. 12 находится в пределах диапазона, поэтому вы не получаете ошибку.