I concur. The solution is to cast. The JVM has no way of knowing what an objects sub-classes can be so if it doesn't find the object to be of the same type or of one of its supertypes it can't do the asignment. This is a protection against assignments of incompatible types.
e.g
abstract class Fruit{}
public class Banana extends Fruit{}
we can say that Banana is a
fruit because Fruit is Banana's superclass but we can't know for sure if a Fruit object is a Banana because maybe it's an apple.