2013-01-08 26 views
19

thể trùng lặp:
ArrayList is a raw type. References to generic type ArrayList<E> should be parameterizedCảnh báo ArrayList là một loại thô. Tài liệu tham khảo để chung kiểu ArrayList <E> nên tham số

Để tiết kiệm một ArrayList với khoản thanh toán được thực hiện bởi một thành viên Tôi muốn thay đổi Danh sách ID của thanh toán thành một chuỗi, vì vậy tôi đã tạo phương pháp sau:

public String fromArraytoString(ArrayList items){ 
     JSONObject json = new JSONObject(); 
     json.put("uniqueArrays", new JSONArray(items)); 
     return json.toString(); 
      } 

Nhưng tôi nhận được cảnh báo llowing:

ArrayList is a raw type. References to generic type ArrayList<E> should be parameterized 

Mọi người có thể giải thích cho tôi lý do không?

Trả lời

39

Bạn chắc chắn nên đọc hướng dẫn này trên Java Generics: http://docs.oracle.com/javase/tutorial/java/generics/

Tóm lại:

Nhiều lớp Java và các loại (được gọi là các lớp chung chung hoặc loại chung), thường là các bộ sưu tập, được gọi là nhập e thông số, chẳng hạn như E trong ArrayList<E> (E chỉ là một cái tên được lựa chọn tùy ý, các lớp học khác tên nó như T hoặc bất kỳ):

public class ArrayList<E> extends ... { 

    public E get(int index) { ... } 

    public boolean add(E element) { ... } 

    // other methods... 
} 

Bây giờ, khi bạn tạo một thể hiện của lớp như thế, bạn định nghĩa một bê tông giá trị của tham số kiểu, ví dụ String (E thường có thể được đánh giá để bất cứ loại bạn muốn):

ArrayList<String> stringList = new ArrayList<String>(); 

Từ giờ trở đi, tất cả các E s được "thay thế" bởi String cho stringList biến, vì vậy bạn có thể thêm chỉ Strings vào nó và nhận được chỉ Strings từ nó. Kiểm tra trình biên dịch cho bạn rằng bạn không nhầm lẫn thêm một đối tượng kiểu khác:

stringList.add(Integer.valueOf(1)); 
// compile error - cannot add Integer to ArrayList of Strings 

Tuy nhiên, do Generics đã được thêm vào Java 5, nó vẫn còn có thể viết mã mà không có họ để tương thích ngược . Vì vậy, bạn có thể viết:

ArrayList list = new ArrayList(); 

Nhưng bạn mất tất cả các lợi ích kiểm tra loại. E s trong các chữ ký phương thức trở thành chỉ đơn giản là Object s.

list.add(Integer.valueOf(42)); // adding an Integer 
list.add("aaa"); // adding a String 

Object something = list.get(0); // unknown type of returned object, need to cast 
Integer i0 = (Integer) something; // this unsafe cast works... 
Integer i1 = (Integer) list.get(1); // but this fails with a ClassCastException 
// because you cannot cast a String to Integer 

Thực tế là sử dụng một liệu loại (có nghĩa là một kiểu generic với tham số kiểu của nó bỏ qua) là không an toàn, là lý do cho những cảnh báo bạn đã có. Thay vì chỉ ArrayList, hãy sử dụng ArrayList<String> hoặc ArrayList<Integer> hoặc bất kỳ loại nào của số items của bạn.

+0

Wow nhờ điều này! Giải thích rất rõ ràng @Natix. +1 – KarenAnne

+1

Có thể bạn đưa ra giải pháp chính xác cho câu hỏi được hỏi? – Satish

4

Loại đối tượng nào được lưu trữ trong ArrayList? Bạn cần thêm nó vào khai báo. Đó là luôn luôn

ArrayList<Type> 

Vì vậy, nếu đó là một danh sách các JSONObjects, bạn sẽ đặt

ArrayList<JSONObject> 

Hy vọng rằng sẽ giúp.

1

Điều này là do trình biên dịch Java cố gắng thực hiện kiểm tra nhất định cho bạn. Cách bạn đã viết nó, bạn có hiệu quả nói với trình biên dịch, bạn sẽ nhận được ArrayList của đối tượng như tham số. Nó chỉ đơn giản là khuyến khích bạn chỉ định lớp đối tượng bạn sẽ lưu trữ trong ArrayList. Chỉ định ArrayList<MyClass> hoặc ArrayList <?> sẽ loại bỏ cảnh báo. Phiên bản thứ hai có hiệu quả nói với trình biên dịch rằng bạn sẽ vượt qua ArrayList của các đối tượng của lớp không được biết tại thời gian biên dịch.

Tôi nghĩ có thể hữu ích khi bạn đọc một chút về Generics trong Java. http://docs.oracle.com/javase/tutorial/java/generics/

1

JsonArray 'constructor s hy vọng sẽ nhận được một kiểu generic Collection với tham số T, trong khi items' s loại là ArrayList không có loại quy định (nghĩa là kiểu thô). Bạn có thể kiểm tra câu hỏi này để có được một số ý tưởng về loại nguyên liệu: What is a raw type and why shouldn't we use it?

Giải pháp 1 (recommended): pass items với paramter T hoặc chỉ định kiểu dữ liệu cụ như String. Câu hỏi này có thể giúp bạn trong vấn đề cụ thể của bạn: convert ArrayList<MyCustomClass> to JSONArray.

Giải pháp 2: thêm @SuppressWarnings("unchecked") trước phương thức fromArraytoString. này không được khuyến khích, nhưng bạn có thể tham khảo cho câu hỏi này: What is SuppressWarnings ("unchecked") in Java?

+0

Cảm ơn, tôi có một danh sách ID (giả sử, 1, 2, 3 ...) là tất cả các khoản thanh toán trong cơ sở dữ liệu. Tôi chỉ muốn lưu trữ danh sách ID này trong một ArrayList trong cơ sở dữ liệu. Bạn có thể cho tôi một ví dụ nhỏ không? – Diego

+0

Chỉ cần thay đổi 'fromArraytoString (ArrayList items)' thành 'fromArraytoString (ArrayList items)' có thể hoạt động (Nếu các mục của bạn là tất cả kiểu 'String'. –

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