upcast dont require an explicit cast as a subclass is always guaranteed to pass the is-a test with its parent. ie ArrayList is a Collection.
downcast requires an explicit cast because the object being cast might not be what its being cast to. You are basically saying to the compiler trust me i know what im doing.