Những người khác đã giải thích vấn đề, nhưng trong trường hợp này, có một giải pháp rất đơn giản cho nó. Chỉ cần rời khỏi dàn diễn viên và mã của bạn sẽ biên dịch. :):
ArrayList<ClSprite> AllSprites = savedInstanceState.getParcelableArrayList("AllSprites");
Tại sao?
Hãy nhìn vào chữ ký của phương pháp getParcelableArrayList
:
public <T extends Parcelable> ArrayList<T> getParcelableArrayList(String key)
Đó là một phương pháp chung chung mà tham số kiểu phải là một đứa trẻ của Parcelable
. Nếu bạn gán trực tiếp cho một biến như sau:
ArrayList<ClSprite> AllSprites; // declaration somewhere
// ClSprite implements Parcelable
...
AllSprites = savedInstanceState.getParcelableArrayList("AllSprites");
trình biên dịch có thể suy ra thông số loại, vì vậy không cần đúc gì cả! Sau khi suy luận, chữ ký sẽ trông như thế này:
public ArrayList<ClSprite> getParcelableArrayList(String key)
Rõ ràng, chúng ta không cần phải đúc từ ArrayList<ClSprite>
để ArrayList<ClSprite>
. :)
Nhưng tại sao bạn gặp lỗi này? Nếu bạn thực hiện một diễn viên và không gán biến trực tiếp cho giá trị trả về của phương thức này, trình biên dịch không thể suy ra tham số kiểu, nó chỉ biết rằng kiểu trả về là ArrayList<Parcelable>
. Và trong trường hợp này, lỗi xảy ra ở những nơi mà những người khác đã giải thích.
Ngoài ra nếu phương pháp này sẽ không được chung chung, nhưng như thế này:
public ArrayList<Parcelable> getParcelableArrayList(String key)
bạn không thể gán giá trị trả về để AllSprites
, vì không có khấu trừ loại ở tất cả, và bạn không thể chuyển đổi từ ArrayList<Parcelable>
để ArrayList<ClSprite>
. Mặc dù nó có ý nghĩa, Java sử dụng type erasure cho generics, và làm cho những điều này không an toàn khi chạy.
... Được rồi, vì vậy ** câu hỏi của bạn là gì **? –
có thể trùng lặp của [Generics in Java] (http://stackoverflow.com/questions/1794842/generics-in-java) – Thilo
Nhìn vào tiêu đề, Không thể truyền từ ArrayList sang ArrayList –