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

Концепция конечного литья не применяется для перегрузки

В моем классе литья учитель научил нас интересному факту следующим образом.

class Casting {
    public static void main(String args[]){
        int i = 10;
        byte b = i;
        System.out.println(b);
    }
}

Мы получили сообщение об ошибке

java:5: possible loss of precision

И затем мы изменили код следующим образом

class Casting1 {
    public static void main(String args[]){
        final int i = 10;
        byte b = i;
        System.out.println(10);
    }
}

10

Мы получили правильный результат. По этой причине он сказал, что когда мы изменяем переменную final, переменная хранится в наименьшем возможном типе данных. В этом случае был byte. Это причина, по которой мы смогли применить это без использования ключевого слова cast.

Но когда мы используем такую ​​перегрузку метода,

class A {
    void m(int i){
        System.out.println("int");
    }
    void m(byte b){
        System.out.println("byte");
    }
    public static void main(String args[]){
        A a1 = new A();
        final int i = 10;
        a1.m(i);
    }
}

Я получаю вывод int. Если конечные переменные хранятся в наименьшем возможном типе данных, это должно быть byte. Поэтому я попробовал следующий код без перегрузки.

class A {
    void m(byte b){
        System.out.println("byte");
    }
    public static void main(String args[]){
        A a1 = new A();
        final int i = 10;
        a1.m(i);
    }
}

java:9: m(byte) in A cannot be applied to (int)

В чем причина этого? Есть ли какой-то момент, который я неправильно понял?

4b9b3361

Ответ 1

Вы смешиваете пространство памяти переменных и их тип. Вызов метода m (...) в первую очередь проверяет тип переменной параметрирования. Здесь он является int, поэтому он будет выбирать соответствующий перегруженный метод, независимо от размера int в памяти.

Хотя я действительно приветствую первый пример, который приносит свет в одну из характеристик окончательного идентификатора.

Ответ 2

Этот бит не совсем корректен...

"По этой причине он сказал, что, когда мы модифицируем переменную final, переменная хранится в наименьшем возможном типе данных. В этом случае это байт."

Он не сохраняет его как байт, он сохраняет его как int, НО он является фактически константой, поэтому, когда Java компилирует строку byte b = i;, она точно знает, что значение будет равно 10, что не нужно лить.

Ответ 3

Есть ли какой-то момент, который я неправильно понял?

Да. Поиск метода, который будет применяться, зависит от типов аргументов. В отличие от случаев присваивания, нет попытки конвертации аргументов метода (по крайней мере, до того, как на язык был добавлен автобоксинг, который добавляет еще один набор произвольных правил).

Ответ 4

Если преобразование является частью назначения, и значение может вписываться в byte, компилятор автоматически выполняет преобразование для вас.

JLS ясно объясняет, что это особый случай, который применяется только к присваиванию, а не к конверсиям в других контекстах.

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