Others already explained the problem, but in this case, there is a very simple solution for it. Simply leave the cast, and your code will compile. :) :
ArrayList<ClSprite> AllSprites = savedInstanceState.getParcelableArrayList("AllSprites");
Why?
Take a look at the signature of the getParcelableArrayList method:
public <T extends Parcelable> ArrayList<T> getParcelableArrayList(String key)
It's a generic method whose type parameter must be a child of Parcelable. If you assign it directly to a variable like this:
ArrayList<ClSprite> AllSprites; // declaration somewhere
// ClSprite implements Parcelable
...
AllSprites = savedInstanceState.getParcelableArrayList("AllSprites");
the compiler can deduce the type parameter, so there is no need the cast at all! After deducing, the signature would look like this:
public ArrayList<ClSprite> getParcelableArrayList(String key)
It is clear the we do not have to cast from ArrayList<ClSprite> to ArrayList<ClSprite>. :)
But why did you got this error? If you perform a cast and not assign the variable directly to the return value of this method, the compiler cannot deduce the type parameter, it only knows that the returned type is ArrayList<Parcelable>. And in this case, the error takes places what the others already explained.
Also if the method would not be generic, but like this:
public ArrayList<Parcelable> getParcelableArrayList(String key)
you could not assign the return value to AllSprites, because there is no type deduction at all, and you cannot convert from ArrayList<Parcelable> to ArrayList<ClSprite>.
Even though it would make sense, Java uses type erasure for generics, and makes these things unsafe at runtime.