2016-08-24 23 views
1

當我設置原始Int類型到Int64它工作正常。我甚至可以在補充類___Int64中捕獲構造函數方法,它接受兩個Int值 - 高和低。看來,這個轉換是靜態的,甚至這樣的代碼工作完美:haxe:投射整數來抽象Int64

var short:Int = 1111; 
var long:Int64 = 2222; 
long = short; 
trace(long.high, long.low); // =0,1111 

但是,當我從外地如設置openfl.utils.Object實例的值:

var id:Int64 = data["id"]; 

其中"id"字段的值無論是IntInt64 - 我有一個錯誤TypeError: Error #1034: Type Coercion failed: cannot convert 1111 to haxe._Int64.___Int64.

當然,我可以檢查該字段的類型,並能夠正確實例化一個。但是,有沒有一個簡潔的解決方案來自動化類型轉換?

回答

2

您可以使用abstract typeimplicit castsDynamic(返回值爲openfl.utils.Object的數組訪問權限)來抽象檢查。

abstract AnyInt64(Int64) from Int64 to Int64 { 
    @:from static function fromDynamic(d:Dynamic):AnyInt64 { 
     if (Std.is(d, Int)) 
      return Int64.ofInt(cast d); 
     if (Int64.is(d)) { 
      var i:Int64 = cast d; 
      return i; 
     } 
     throw "conversion error"; 
    } 
} 

用法:

var data = new openfl.utils.Object(); 

data["int"] = 500; 
var id:AnyInt64 = data["int"]; 

data["int64"] = Int64.make(1, 0); 
var id2:AnyInt64 = data["int64"]; 

你需要找到對付企圖轉化,但沒有IntInt64雖然(除非你只使用這兩種類型)的好方法。使用Null<Int64>作爲AnyInt64的基礎類型+檢查null可能有效。

+0

我已經添加了從'Float'的轉換,因爲它是通過JSON創建具有大數字的對象時的常見類型。 – meps