Unlike unsafe casts, the runtime behavior in case of a failing cast is defined for safe casts:
class Base { public function new() {} } class Child1 extends Base {} class Child2 extends Base {} class Main { public static function main() { var child1:Base = new Child1(); var child2:Base = new Child2(); cast(child1, Base); // Ok cast(child1, Child2); // Exception: Class cast error } }
In this example we first cast a class instance of type Child1
to Base
, which succeeds because Child1
is a child class of Base
. We then try to cast the same class instance to Child2
, which is not allowed because instances of Child2
are not instances of Child1
.
The Haxe compiler guarantees that an exception of type String
is thrown in this case. This exception can be caught using a try/catch
block.
Safe casts have a runtime overhead. It is important to understand that the compiler already generates type checks, so it is redundant to add manual checks, e.g. using Std.isOfType
or the is
keyword. The intended usage is to try the safe cast and catch the String
exception.