Câu trả lời ngắn cho câu hỏi của bạn là rằng bạn phải ngăn chặn nó để nó biến mất. Vấn đề không phải là về những gì bạn đặt bằng phương thức addAll, đó là vì JSONArray không có cách nào để đảm bảo an toàn loại nếu kiểu không được cung cấp.
JSONArray thừa hưởng một ArrayList phi parametrized và phương pháp addAll được định nghĩa là:
public boolean addAll(java.util.Collection<? extends E> es)
Nếu không cung cấp các tham số kiểu, E rơi trở lại vào Object, mà làm cho phương pháp addAll một phương pháp mà có thể thêm một bộ sưu tập chứa ANYTHING ở đầu bộ sưu tập hiện có.Do đó, bạn có thể làm điều gì đó như sau:
List<Dog> dogs = new ArrayList<Dog>();
dogs.add(new Chiwawa());
List<Car> cars = new ArrayList<Car>();
cars.add(new BMW());
JSONArray jsonArray = new JSONArray();
jsonArray.addAll(dogs);
jsonArray.addAll(cars);
Chó và xe ô tô được thêm vào cùng một JSONArray (ArrayList) và được coi là đối tượng hiếm khi. Nếu bạn làm một cái gì đó như thế này, khi bạn lấy bất kỳ đối tượng nào trở lại, bạn không có cách nào để nói đó là một con chó hay một chiếc xe hơi. Đây là lý do tại sao cảnh báo tồn tại.
Bằng cách sử dụng các tham số chung loại (ví dụ Dog), định nghĩa addAll sẽ như thế nào:
public boolean addAll(java.util.Collection<? extends Dog> es)
này đảm bảo thông số chỉ có thể chấp nhận một bộ sưu tập của Chó và chó của lớp trẻ. Vì vậy khi bạn lấy nó từ bộ sưu tập, nó là an toàn để gán đối tượng truy xuất cho Dog.
Cảnh báo không phải vì bạn đã làm điều gì đó sai. Đó là vì JSONArray thừa kế một bộ sưu tập không được parametrized. Cảm thấy tự do để ngăn chặn nó.
Xin lỗi nhưng không có gì bạn có thể làm vì vấn đề là trong việc triển khai JSONArray, Nó không sử dụng Generics. – Felquir
Bạn có đề xuất sử dụng một triển khai khác của JSONArray không? Nói cách khác để sử dụng một gói khác hơn là 'org.json.simple.JSONArray' hoặc tốt hơn là thêm' @SuppressWarnings ('unchecked') '? – Brenne
Đọc câu trả lời của tôi. – Felquir