2010-07-20 10 views
6

Co się dzieje, gdy obiekt java.lang.Double jest inicjowany bez użycia wywołania do konstruktora, ale zamiast tego używa prymitywu? Wygląda na to, że działa, ale nie jestem do końca pewien, dlaczego. Czy jest jakiś rodzaj niejawnej konwersji z kompilatorem? To jest za pomocą Java 5.Inicjowanie obiektu podwójnego z prymitywną wartością podwójną

public class Foo { 

    public static void main(String[] args) { 
     Double d = 5.1; 

     System.out.println(d.toString()); 

    } 

} 
+1

Teraz wiedząc, że to się nazywa autoboxing, można znaleźć wiele [interesujących artykułów w SO] (http://stackoverflow.com/search?q= [java] + autoboxing) :) –

+0

Autboxing, właśnie tego szukałem dla. Dziękuję! –

Odpowiedz

9

ten nazywa Autoboxing co jest cechą, która została dodana w Java 5. Ponadto automatyczną zmianę podstawowych typów i rodzajów bibułki, takich jak double (pierwotny) i java.lang.Double (The wrapper obiektu). Kompilator Java automatycznie przekształca linię:

Double d = 5.1; 

do:

Double d = Double.valueOf(5.1); 
5

To się nazywa AutoBoxing

autoboxing i Auto-Unboxing od prymitywnych typów konwersji między prymitywnych typów, jak int, boolean, i ich odpowiedniki oparte na obiektach odpowiedniki jak Integer a nd Boolean, może wymagać niepotrzebnych ilości dodatkowego kodowania , zwłaszcza jeśli konwersja jest potrzebna tylko dla wywołania metody do interfejsu API kolekcji, na przykład .

Autokakowanie i automatyczne rozpakowywanie prymitywów Java powoduje, że kod jest bardziej zwięzły i łatwiejszy w wykonaniu. W następnym przykładzie int jest przechowywany, a następnie pobierany z ArrayList. Wersja 5.0 pozostawia konwersję wymaganą do przejścia na Integer iz powrotem do kompilatora.

Przed

ArrayList<Integer> list = new ArrayList<Integer>(); 
    list.add(0, new Integer(42)); 
    int total = (list.get(0)).intValue(); 

Po

ArrayList<Integer> list = new ArrayList<Integer>(); 
    list.add(0, 42); 
    int total = list.get(0); 
Powiązane problemy