Почему Java не выбирает метод, перегруженный с параметром посредством autoboxing?

У меня есть следующий код:

public static void main(String ... args) {
    int valor = 30;
    metodoSobrecargado(valor);
}

private static void metodoSobrecargado(long valor) {
    System.out.println("Primitivo long.");
}

private static void metodoSobrecargado(Integer valor) {
    System.out.println("Clase Integer.");
}

Выполнив с Java 7, напечатай на экране 'Примитивный long.', но мне не удается объяснить, почему происходит это. Он не был бы должен печатать 'Класс Integer.' ввиду autoboxing, который делает Java конвертируя целую переменную типа valor в Ваш wrapper Integer и выбирая метод metodoSobrecargado что получает как параметр объект этого типа?

3
задан 24.03.2016, 08:22
1 ответ

Разум состоит в том, что Java будет предпочитать превращение примитивных типов перед boxing, а именно, так как ни одна на грузе не получает int будешь предпочитать делать cast в long (Widening Примитиве Конверсион) перед тем, как делать boxing в Integer (Boxing Превращение)

Взамен, если код был:

public static void main(String[] args) {
    Integer valor = 30;
    metodoSobrecargado(valor);
}

Или если второй метод был признан таким:

private static void metodoSobrecargado(int valor) {
    System.out.println("Clase Integer.");
}

Тогда типы, если considirian уже он был int или Integer, и следовательно он назвался бы в ожидаемую перегрузку.

Согласно спецификации Java 7:

5.3. Method Инвокатион Конверсион

Method invocation превращение is applied to each argument оцените in в method or строитель invocation (§8.8.7.1, §15.9, §15.12): the type of the argument expression must be converted to the type of the corresponding parameter.

Method invocation contexts allow the использовал of one of the following:

  • an identity превращение (§5.1.1)
  • в widening primitive превращение (§5.1.2)
  • в widening reference превращение (§5.1.5)
  • в boxing превращение (§5.1.7) optionally followed by widening reference превращение
  • an unboxing превращение (§5.1.8) optionally followed by в widening primitive превращение.

Мой перевод:

5.3. Превращение Призыва Метода

Превращение Призыва Метода применено к каждой стоимости аргумента в призыве метода или строителе (§8.8.7.1, §15.9, §15.12): Тип выражения аргумента должен быть обращенным в тип соответствующего параметра.

Контексты призыва метода позволь использование одного из следующих:

  • превращение тождества (§5.1.1)
  • примитивное широкое превращение (§5.1.2)
  • превращение широкой ссылки (§5.1.5)
  • превращение boxing (§5.1.7) необязательно следуемая превращением широкой ссылки
  • превращение unboxing (§5.1.8) необязательно следуемая примитивным широким превращением

А именно, когда аргумент int нужно конвертировать в тип параметра будьте long или Integer будет выбран сначала согласно списку widening primitive превращение ( int в long) прежде чем boxing превращение ( int в Integer)

3
ответ дан 24.11.2019, 14:41

Теги

Похожие вопросы