2013-02-22 22 views
5
class Test{ 
    public static void main(String[] args){ 
     int a = 1; 
     int b = 5; 

     Integer c = new Integer(1); 
     Integer d = 5; //autoboxing at work 

     System.out.println(c.compareTo(d)); 
     System.out.println(a.compareTo(b)); 
    } 
} 

Dlaczego a.compareTo(b) nie kompiluje (int cannot be dereferenced)? Wiem, że compareTo wymaga obiektów, ale myślałem, że autoboxing automatycznie wykona int , gdy będzie to konieczne. Dlaczego w tym przypadku nie występuje autoboxing? A jakie inne przypadki się nie pojawią?Java nie autoboxing dla int dla metody compareTo?

Odpowiedz

4

Z Oracle tutorial on Autoboxing, dwa przypadki, gdzie występują boks są przy prymitywów:

  • przekazywany jako parametr sposobu, który oczekuje przedmiotu odpowiadającej klasie owijki.
  • Przypisany do zmiennej odpowiedniej klasy opakowania.

Wyrażenie oceniane w twoim przykładzie (a.compareTo(d)) nie należy do żadnego z tych scenariuszy.

Jest kilka interesujących dodatkowych informacji w JCP proposal for autoboxing, opisujących mechanikę i zasady konwersji przypisania, konwersję wywołań metod i konwersję rzutowania.