Другие уже объяснили проблему, но в этом случае есть очень простое решение для нее. Просто оставьте приведение, и ваш код скомпилируется. :):
ArrayList<ClSprite> AllSprites = savedInstanceState.getParcelableArrayList("AllSprites");
Почему?
Посмотрите на сигнатуру метода getParcelableArrayList
:
public <T extends Parcelable> ArrayList<T> getParcelableArrayList(String key)
Это универсальный метод, параметр типа которого должен быть дочерним по отношению к Parcelable
.Если вы присваиваете его непосредственно такой переменной:
ArrayList<ClSprite> AllSprites; // declaration somewhere
// ClSprite implements Parcelable
...
AllSprites = savedInstanceState.getParcelableArrayList("AllSprites");
, то компилятор может определить параметр типа, поэтому приведение вообще не нужно!После вывода подпись будет выглядеть следующим образом:
public ArrayList<ClSprite> getParcelableArrayList(String key)
Понятно, что нам не нужно разыгрывать от ArrayList<ClSprite>
до ArrayList<ClSprite>
.:)
Но почему вы получили эту ошибку?Если вы выполняете приведение и не назначаете переменную непосредственно возвращаемому значению этого метода, компилятор не может определить параметр типа, он только знает, что возвращаемый тип равен ArrayList<Parcelable>
.И в этом случае ошибка занимает место, как уже объяснили другие.
Также, если метод не будет универсальным, но вот так:
public ArrayList<Parcelable> getParcelableArrayList(String key)
вы не можете присвоить возвращаемое значениев AllSprites
, потому что вычитания типов вообще нет, и вы не можете преобразовать из ArrayList<Parcelable>
в ArrayList<ClSprite>
.Несмотря на то, что это имеет смысл, Java использует стирание типа для шаблонов и делает эти вещи небезопасными во время выполнения.