2009-09-13 17 views
28

Słyszałem o typach określanych jako "pudełkowe" w niektórych językach.Co to znaczy, że typ jest "pudełkowy"?

W języku Java słyszałem o "autoboxing". Co to jest? Czy ma klasy opakowania dla typu? Jak zmieniłby się mój kod, jeśli pracuję z typami pudełkowymi lub bez pudełka?

Odpowiedz

46

Niektóre typy danych są uważane za "pierwotne", co oznacza, że ​​nie są traktowane jak obiekt i nie mają właściwości obiektu.

Na większości platform, liczby całkowite i znaki są przykładami typów, które są prymitywne, ale mogą być w ramkach.

Boks to zawijanie ich w obiekt, dzięki czemu zachowują się one jak obiekt.

Dokładne znaczenie i zachowanie zależy od języka, którego używasz. Niektóre języki (takie jak Smalltalk ... przynajmniej wracają, gdy robiłem to ...) nie pozwalają na żadne prymitywne typy i uważają wszystko za obiekt, ale jest z tym związana kara, ponieważ na końcu dnia, procesor musi pracować z liczbami nieprzetworzonymi i pamięcią surową, aby wykonać użyteczną pracę. Jeśli chcesz dodać dwie liczby całkowite, które zostały umieszczone w ramkach, na przykład, za kulisami są one "rozpakowane" na typy pierwotne, liczby są dodawane, a następnie są one ponownie umieszczane w nowej liczbie całkowitej.

3

Typ pola oznacza, że ​​wartości są przydzielane w bloku na stercie i są wskazywane przez wskaźnik. Jest to dobre dla jednolitości implementacji środowiska wykonawczego (ułatwia funkcje ogólne, itd.) Kosztem dodatkowego pośrednictwa.

0

Generalnie podczas pracy z kolekcjami mamy do czynienia z tablicami obiektów. W językach takich jak Java istnieje różnica między obiektem pierwotnym a obiektem. Kiedy prymityw jest "zapakowany", jest to po prostu otok dookoła prymitywisty, więc gra ładnie z resztą struktury, która oczekuje obiektu.

Autoboxing jest tylko aktem wprowadzenia prymitywu do obiektu lub przezroczystego wyciągnięcia prymitywnego z obiektu, więc nie musisz się martwić o dodatkowy krok, aby zrobić to samemu.

12

Tak, boks to przyjęcie typu wartości i zawijanie go w typ referencyjny. Od czasu wprowadzenia java autoboxing można:

void foo(Object bar) {} 
//... 
    foo(1); 

I java automatycznie zamieni int 1 w Integer. W poprzednich wersjach trzeba było zrobić:

foo(new Integer(1)); 

autoboxing jest najbardziej przydatna w java podczas pracy z rodzajowych, ponieważ nie można używać prymitywów z rodzajowych, więc do przechowywania wskazówki na liście, trzeba zrobić List<Integer> i umieścić na liście ints.

11

Bardziej szczegółowe informacje na Java:

autoboxing Java pozwala na automatyczne automatycznie konwertować rzeczy jak boolean i int do ich wersji obiektu Boolean i Integer w większości przypadków. Pozwala również na odwrót.

Na przykład:

int a = 3; // no boxing is happening 
Integer b = 3; // newer versions of java automatically convert the int 3 to Integer 3 
int c = b; // these same versions also automatically convert Integer 3 to int 3 

starszych wersji Java, które nie mają autoboxing będą wymagały tego kodu, aby zrobić to samo:

int a = 3; // works the same 
Integer b = new Integer(3); //must set up a Integer object manually 
int c = b.intValue(); //must change Integer object to a primitive 

Jednak istnieją pewne sytuacje, w których nadal mają robić rzeczy ręcznie. Na przykład, wyobraź sobie, że masz klasę z dwóch metod tak:

assertEquals(int a, int b); 
assertEquals(Object a, Object b) 

Teraz, jeśli spróbujesz to zrobić:

Integer a = 3; 
int b = 3; 
assertEquals(a, b); // this will not compile 

Powodem tego nie działa dlatego, że nie może dowiedzieć się, czy należy rozwinąć a do int lub pole b na Integer. Dlatego jest niejednoznaczne, który sygnaturę metody należy wywołać. Aby rozwiązać ten problem można wykonać jedną z nich:

assertEquals((int) a, b); 
assertEquals(a, (Integer) b); 
0

pudełkowany oznacza, że ​​miały one typ wartości regularne i stworzył obiekt wokół niego. Coś w rodzaju umieszczania go w pudełku. Zasadniczo należy tego unikać, ze względu na obciążenie związane z konstruowaniem obiektu.