Я взял этот фрагмент кода из какой-то викторины, используя IDE, я выполнил его и получил длинный, длинный ответ , но правильный ответ - Байт, Байт , почему я получил другой результат? Вопрос связан с JDK 11
public class Client {
static void doCalc(byte... a) {
System.out.print("byte...");
}
static void doCalc(long a, long b) {
System.out.print("long, long");
}
static void doCalc(Byte s1, Byte s2) {
System.out.print("Byte, Byte");
}
public static void main(String[] args) {
byte b = 5;
doCalc(b, b);
}
}
Отредактированный:
Код был взят здесь: Обзор сертификации Oracle и примеры вопросов (Страница: 13, Вопрос: 5)
Byte b = 5;
с большой буквы?long, long
на Java8 тоже FYI ... Не уверен, почему, если честно, жду ответа тоже :)Ответы:
Так что , если вы идете через язык Java спецификацию для определения сигнатуры методы во время компиляции станет ясно:
Итак, из приведенных выше шагов ясно, что в вашем случае на первом этапе компилятор Java найдет подходящий метод, который это делает
doCalc(long a,long b)
. Ваш методdoCalc(Byte s1, Byte s2)
нуждается в автобоксе во время вызова, поэтому он будет иметь меньше предпочтений.источник
long
принимаетbyte
, кажется, следует расширение примитивного преобразования : docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.2 . Таким образом , в основном,+widening -boxing -varargs
то+widening +boxing -varargs
потом+widening +boxing +varargs
.Byte, Byte
?Пожалуйста, прочитайте главу JLS о конверсиях .
В вашем случае происходит то, что во время выполнения JVM решает выполнить расширенное преобразование, так
byte -> long
как это преобразование безопаснее, поскольку гарантируется, что оно не вызываетRuntimeException
.Преобразование из
byte
вByte
также вызываемый бокс может привести к OutOfMemoryError, поскольку JVM должна разместить новые объекты в куче:Из-за этого более безопасное
byte -> long
расширение конверсии является предпочтительным.источник
byte
доByte
никогда не вызываетOutOfMemoryException
, так как все значенияByte
(-128 - 127) внутренне кэшируются. Но это может не совпадать с другими типами, поэтому, как правило, расширение конверсии получает приоритет.Для нахождения правильной перегрузки, порядок:
Так
b
гдеByte
результат будетByte, Byte
.new byte[] { b, b }
бы результатbyte, byte
.long, long
.Byte, Byte
результаты.источник