2013-10-06 9 views
2

Хорошо, вот код:Может ли кто-нибудь объяснить мне этот автобоксинг?

public class Dec26 { 
    public static void main(String args[]) { 
     short a1=6; 
     new Dec26.go(a1); 
     new Dec26.go(new Integer(7)); 
    } 
    void go(Short x){System.out.println("S");} 
    void go(Long x){System.out.println("L");} 
    void go(int x){System.out.println("i");} 
    void go(Number n){System.out.println("N");} 
} 

Почему выход «в», а не «б»?

+0

Если вы читаете книгу Кэти Сьерра, то объяснение, данное там, четкое. Расширение предпочтительнее по боксу/распаковке. У вас есть другая путаница? –

ответ

0

Java-компилятор применяет распаковку, когда объект класса обертки:

  • передается в качестве параметра метода, ожидающего значение соответствующего примитивного типа.
  • Назначается переменной соответствующего примитивного типа.

Итак, как был подходящим метод для класса Integer, который является void go(Number n), потому что Number класса супер класса Integer и этот метод принимает Integer объектов. Поэтому компилятору не нужно было удалять Integer до int.

0

Компилятор выбирает самое близкое совпадение без автобоксинга/распаковки. Он нашел go (Number) и не использовал unboxing.