[1] This is only allowable if the object is already an instance of the derived class, and so this conversion is inherently fallible.
The possible results of comparing polymorphic types—besides them being equivalent (identical), or unrelated (incompatible)—include two additional cases: namely, where the first type is derived from the second, and then the same thing but swapped the other way around (see: Subtyping § Subsumption).
[2] Downcasting is useful when the type of the value referenced by the Parent variable is known and often is used when passing a value as a parameter.
In the below example, the method objectToString takes an Object parameter which is assumed to be of type String.
While we could also convert myObject to a compile-time String using the universal java.lang.Object.toString(), this would risk calling the default implementation of toString() where it was unhelpful or insecure, and exception handling could not prevent this.