2011-01-31 26 views
5

List<String> hoạt động có hoặc không có nhưng List<int> thì không. Tôi đã luôn luôn tự hỏi về điều này.Có <String> làm gì không?

+1

có hoặc không có gì? Có thể vì String là một lớp và int là một kiểu gốc. – Raynos

+0

có hoặc không có gì? ooops, 3 giây quá muộn ^^ –

+2

http://en.wikipedia.org/wiki/Generics_in_Java –

Trả lời

2

Danh sách (và các bộ sưu tập khác) chỉ có thể giữ các đối tượng, không phải các loại nguyên thủy. Vì vậy, bạn có thể sử dụng List<Integer> nhưng không sử dụng List<int>. String cũng là một đối tượng - đó là lý do tại sao nó hoạt động.

Và liên quan đến sự khác biệt giữa ListList<String>: sự khác biệt chỉ tồn tại trong quá trình biên dịch. Trong thời gian chạy, cả hai danh sách đều giống hệt nhau.

+0

Cảm ơn vì điều đó. SO nó chỉ phôi nó như là một loại đối tượng String? –

+0

@CoolBeans: điều đó không có ý nghĩa. Nếu bạn đang sử dụng Generics, bạn không cần phôi. Đó là toàn bộ vấn đề. Trình biên dịch sẽ chèn các phôi và * bảo đảm * bằng cách kiểm tra kiểu mà không có ClassCastExceptions. Và cách duy nhất bạn * có thể nhận được * một ClassCastException là bởi * làm * một diễn viên. – EJP

+0

@EJP: Bạn nói đúng. Bình luận của tôi đã bị lùi lại. Tôi có nghĩa là để nói rằng bạn không nên làm Danh sách một số = new ArrayList <>(); mà không chỉ định một loại (chung chung hay không). Tôi sẽ xóa bình luận của tôi. Cảm ơn!!! – CoolBeans

5

Bạn không thể sử dụng các loại nguyên thủy (byte, short, int, etc.). Bạn phải sử dụng các loại wrapper đó, trong trường hợp này, là Integer

List<Integer> 

Đây là loại đúc được gọi là thuốc generic, và bạn có thể bắt đầu tìm hiểu thêm về họ here.

3

List<int> không hoạt động vì Generics Java không xử lý các kiểu nguyên thủy - chỉ các đối tượng (hoặc các lớp con của chúng, như Integer). Bạn không cần phải chỉ định tham số kiểu khi sử dụng một lớp chung, nhưng trình biên dịch sẽ đưa ra một cảnh báo và bạn sẽ được yêu cầu chăm sóc mọi kiểu đúc (bao gồm giao dịch với số ClassCastExceptions) và chính bạn.