An interface type can only be converted to an interface type or to object. If the
new type is an interface, it must be a superinterface of the old type.
A class type can be converted to a class type or to an interface type. If converting to a
class type the new type should be superclass of the old type. If converting to an
interface type new type the old class must implement the interface.
An array maybe converted to class object, to the interface cloneable, or to an array.
Only an array of object references types may be converted to an array, and the old
element type must be convertible to the new element