2013-01-15 10 views
32

Chcę zadeklarować ArrayList typu integer.Dlaczego nie mogę mieć int w typie ArrayList?

Dlaczego dodaje daje mi błąd:

ArrayList<int> list1 = new ArrayList<int>(); 

ale następujące prace:

ArrayList<Integer> list1 = new ArrayList<Integer>(); 
+4

Ponieważ 'int' nie jest obiektem w tym samym kontekście' Integer' to – MadProgrammer

+1

Możesz użyć 'TIntArrayList', jeśli chcesz czegoś, co wraps 'int []' –

+0

'int' jest prymitywnym typem danych możemy użyć klasy wrapper w' ArrayList' –

Odpowiedz

34

ArrayList może tylko odwoływać się do typów, a nie do elementów pierwotnych. Integer to klasa, a nie prymitywny.

Kiedy deklarujesz ArrayList<Integer> list1 = new ArrayList<Integer>(), jesteś tworząc ArrayList który będzie przechowywany typ Integer, nie int prymitywne.

Jeśli chcesz przeczytać o różnicę między prymitywnych i referencyjnych typów, sprawdź http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html

+0

Prawdopodobnie nie potrzebujesz argumentu typu po prawej stronie nowego wyrażenia. 'ArrayList list1 = new ArrayList();' działa również. –

11

ponieważ int jest prymitywny typ. Tylko typy odniesienia mogą być używane jako parametry ogólne.

+0

Nawet przed generycznymi (przed Java 5) ograniczenie to było, więc nie uważam, że jest to jedyny powód –

+0

@Pangea: Sure , nie możesz zrobić 'new ArrayList(). add (5)'. Ale OP pyta o błąd w tej linii kodu ... –

+0

@OliCharlesworth Możesz to zrobić właściwie. To po prostu doda wartość 'Integer', a nie' int'. –

0

int to primitive. To nie jest Object.

Więcej informacji można znaleźć pod numerem link.

+1

W aplikacji StackOverflow nie zachęca się do odpowiedzi zawierających tylko łącza. –

4

Krótka odpowiedź jest taka, że ​​leki generyczne (jak ArrayList<Integer>) nie akceptują prymitywnych typów (int) tylko obiekty (Integer).

Dzieje się tak, ponieważ klasy takie jak ArrayList są zaimplementowane jako obiekty. Ponieważ każda klasa dziedziczy po Object, kompilator może po prostu podłączyć inne klasy. Ale typy pierwotne (takie jak int) nie dziedziczą z Object, ponieważ nie są klasami. Tak więc firma Sun/Oracle stworzyła klasę Integer, która ma w tym pomóc.

Krótko mówiąc: int nie jest Object.

+0

To jest najlepsza odpowiedź, ponieważ wyjaśnia to oświadczenie, które działa dobrze: 'ArrayList ' –

0

int to prymitywny typ danych, ale Integer jest klasą tak ArrayList tablica może mieć tylko typy odniesienia jako parametr nie prymitywnego typu

0

wszystkie odpowiedzi powyższa odpowiedź dlaczego, ale korzeń to pytanie jest często auto boks i rozpakowywanie pierwotnych typów danych. Ten problem jest już rozwiązany przez IntBuffer lub ChadBuffer lub podajesz typ pierwotny, który już tam znajduje się w folderze nio. Następnym razem, jeśli chcesz użyć prymitywnej tablicy ArrayList, nie używaj List zamiast używać IntBuffer

Powiązane problemy