Define: nullable
A type in Haxe is considered nullable if
nullis a valid value for it.
It is common for programming languages to have a single, clean definition for nullability. However, Haxe has to find a compromise in this regard due to the nature of Haxe's target languages; while some of them allow and, in fact, default to null for anything, others do not even allow null for certain types. This necessitates the distinction between two types of target languages:
Define: Static target
Static targets employ their own type system where
nullis not a valid value for basic types. This is true for the Flash, C++, Java and C# targets.Define: Dynamic target
Dynamic targets are more lenient with their types and allow
nullvalues for basic types. This applies to the JavaScript, PHP, Neko and Flash 6-8 targets.
There is nothing to worry about when working with null on dynamic targets; however, static ones may require some thought. For starters, basic types are initialized to their default values.
Define: Default values
Basic types have the following default values on static targets:
Int:0Float:NaNon Flash,0.0on other static targetsBool:false
As a consequence, the Haxe Compiler does not allow the assignment of null to a basic type on static targets. In order to achieve this, the basic type has to be wrapped as Null<T>:
// error on static platforms var a:Int = null; var b:Null<Int> = null; // allowed
Similarly, basic types cannot be compared to null unless wrapped:
var a : Int = 0; // error on static platforms if( a == null ) { ... } var b : Null<Int> = 0; if( b != null ) { ... } // allowed
This restriction extends to all situations where unification is performed.
Define:
Null<T>On static targets the types
Null<Int>,Null<Float>andNull<Bool>can be used to allownullas a value. On dynamic targets this has no effect.Null<T>can also be used with other types in order to document thatnullis a permitted value.
If a null value is "hidden" in Null<T> or Dynamic and assigned to a basic type, the default value is used:
var n : Null<Int> = null; var a : Int = n; trace(a); // 0 on static platforms