Концепция конечного литья не применяется для перегрузки
В моем классе литья учитель научил нас интересному факту следующим образом.
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)
В чем причина этого? Есть ли какой-то момент, который я неправильно понял?
Ответы
Ответ 1
Вы смешиваете пространство памяти переменных и их тип.
Вызов метода m (...) в первую очередь проверяет тип переменной параметрирования. Здесь он является int, поэтому он будет выбирать соответствующий перегруженный метод, независимо от размера int в памяти.
Хотя я действительно приветствую первый пример, который приносит свет в одну из характеристик окончательного идентификатора.
Ответ 2
Этот бит не совсем корректен...
"По этой причине он сказал, что, когда мы модифицируем переменную final, переменная хранится в наименьшем возможном типе данных. В этом случае это байт."
Он не сохраняет его как байт, он сохраняет его как int, НО он является фактически константой, поэтому, когда Java компилирует строку byte b = i;
, она точно знает, что значение будет равно 10, что не нужно лить.
Ответ 3
Есть ли какой-то момент, который я неправильно понял?
Да. Поиск метода, который будет применяться, зависит от типов аргументов. В отличие от случаев присваивания, нет попытки конвертации аргументов метода (по крайней мере, до того, как на язык был добавлен автобоксинг, который добавляет еще один набор произвольных правил).
Ответ 4
Если преобразование является частью назначения, и значение может вписываться в byte
, компилятор автоматически выполняет преобразование для вас.
JLS ясно объясняет, что это особый случай, который применяется только к присваиванию, а не к конверсиям в других контекстах.
Стоит отметить, что byte
полезен только тогда, когда вы программируете встроенные устройства или работаете с файлами/сетями. byte
и int
занимают одно и то же пространство, поскольку адреса переменных выравниваются.