2015-10-29 2 views
4

Я пытался понять, как перегруженные методы вызываются с conversions.Let мне объяснить мой вопрос примере я пытаюсьМетод преобразования Призыва

public class Autoboxing { 

    public void meth(Integer i){ 
     System.out.println("Integer"); 
    } 
    public void meth(long i){ 
     System.out.println("Long"); 
    } 
    public void meth(int... i){ 
     System.out.println("int"); 
    } 

    public void meth(Object i){ 
     System.out.println("Object"); 
    } 

    public static void main(String[] args) { 
     Autoboxing box= new Autoboxing(); 
     box.meth(5); 
    } 
} 

здесь выход есть: Long

Почему метод с аргумент long называется вместо этого в Wrapper Integer. Пожалуйста, объясните.

+2

http://stackoverflow.com/q/27940321/1878022 если это поможет понять – VedX

ответ

2

В то время как метод перегруженная форма приходит и пользователь пытается вызвать у тогдашнего компилятора выбран таким образом,

  1. Точное совпадение с данными типа, если находят, то вызвать немедленно. 1.1 Если точное совпадение не соответствует, компилятор попытается совместить с более широким типом данных типа.

  2. Если вышеуказанный случай не работает, тогда он начинает соответствовать авто-боксу.

  3. все выше 2-х точный сбой, тогда начните с символа vararg.
  4. все вышеприведенные случаи сбоя при выдаче ошибки, как cann't решить имя метода.

так в вашем случае 5 является integer(primitive) поэтому начать матч с int '(1-случай), но не так пытается соответствовать с более широким типом данных. здесь, в вашем случае совпадают с long (примитив), который является более широким, то «int»

Итак, что вы получите «Long» выход.

Так же, как и при использовании сценария перегрузки.

5

Реле перегрузки имеет три этапа. На первом этапе пытается найти метод сопоставления без использования автоматического бокса и varargs (поэтому выбирается meth(long i), а не meth(Integer i)). Только если первый этап не находит совпадения, второй этап пытается найти метод сопоставления с автоматическим боксом.

0

Я понимаю, что здесь приоритет 1-го раза расширяется, а затем автобоксирует затем varargs. Поскольку расширение примитивного параметра намного лучше, чем автоматическое боксирование.

Смежные вопросы