2013-01-15 36 views
32

Tôi muốn khai báo một ArrayList kiểu số nguyên.Tại sao tôi không thể có int trong loại ArrayList?

Tại sao những điều sau đây mang lại cho tôi một lỗi:

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

Nhưng các công việc sau:

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

Vì 'int' không phải là một đối tượng trong cùng một bối cảnh' Integer' là – MadProgrammer

+1

Bạn có thể sử dụng 'TIntArrayList' nếu bạn muốn kết thúc tốt đẹp 'int []' –

+0

'int' là kiểu dữ liệu nguyên thủy chúng ta có thể sử dụng lớp wrapper trong' ArrayList' –

Trả lời

34

ArrayList chỉ có thể tham chiếu các loại, chứ không phải kiểu gốc. Integer là một lớp học, không phải là nguyên thủy.

Khi bạn khai báo ArrayList<Integer> list1 = new ArrayList<Integer>(), bạn đang tạo một ArrayList sẽ lưu trữ loại Integer, không phải là nguyên thủy int.

Nếu bạn muốn đọc về sự khác biệt giữa các kiểu dữ liệu và tài liệu tham khảo, hãy kiểm tra http://pages.cs.wisc.edu/~hasti/cs302/examples/primitiveVsRef.html

+0

Bạn có thể không cần đối số loại ở bên phải của biểu thức mới. 'ArrayList list1 = new ArrayList();' cũng hoạt động. –

11

int là một nguyên thủy loại. Chỉ có thể sử dụng các loại tham chiếu làm thông số chung.

+0

Thậm chí trước khi Generics (trước Java 5) hạn chế này đã có, vì vậy tôi không nghĩ rằng lý do duy nhất của nó là –

+0

@Pangea: Sure , bạn không thể làm 'new ArrayList(). add (5)'. Nhưng OP đang hỏi về lỗi wrt rằng dòng mã cụ thể ... –

+0

@OliCharlesworth Bạn có thể làm điều đó thực sự. Nó sẽ chỉ thêm một 'Integer' không phải là giá trị' int'. –

0

intprimitive. Nó không phải là Object.

Tham khảo link để biết thêm chi tiết.

+1

Chỉ liên kết câu trả lời không được khuyến khích tại StackOverflow. –

4

Câu trả lời ngắn gọn là Generics (như ArrayList<Integer>) không chấp nhận các loại nguyên thủy (int), chỉ có các đối tượng (Integer).

Điều này là do các lớp như ArrayList được triển khai khi sử dụng Đối tượng. Vì mỗi lớp kế thừa từ Object, trình biên dịch chỉ có thể cắm vào các lớp khác. Nhưng các kiểu nguyên thủy (như int) không kế thừa từ Object, vì chúng không phải là các lớp. Vì vậy, Sun/Oracle đã thực hiện các lớp học Integer để giúp đỡ với điều này.

Vì vậy, trong ngắn hạn: int không phải là Object.

+0

Đây là câu trả lời hay nhất vì nó giải thích tuyên bố này, hoạt động tốt: 'ArrayList ' –

0

int là một kiểu dữ liệu cơ bản nhưng Integer là một lớp học nên một mảng ArrayList chỉ có thể đưa loại tài liệu tham khảo như tham số của nó không loại nguyên thủy

0

Tất cả các câu trả lời trên câu trả lời tại sao nhưng gốc rễ của câu hỏi này là thường xuyên đấm bốc tự động và unboxing của các kiểu dữ liệu nguyên thủy. Vấn đề này đã được giải quyết bởi IntBuffer hoặc ChadBuffer hoặc bạn đặt tên kiểu nguyên thủy nó đã có trong thư mục nio. Lần sau nếu bạn muốn sử dụng ArrayList nguyên thủy không sử dụng List thay vì sử dụng IntBuffer

Các vấn đề liên quan