2016-08-24 5 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" либо Int или Int64 - я получил ошибку TypeError: Error #1034: Type Coercion failed: cannot convert 1111 to haxe._Int64.___Int64.

конечно, я могу проверить тип поля и правильно создать экземпляр Int64 из Int. Но есть ли опрятное решение для автоматизации литья типов?

ответ

2

Вы можете использовать abstract type с implicit casts из Dynamic (возвращаемого значения массива получить доступ openfl.utils.Object «s) абстрагироваться чеком прочь.

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"]; 

Вы должны были бы найти хороший способ борьбы с попытками преобразований, которые не Int или Int64, хотя (если только вы не используете эти два вида). Использование Null<Int64> в качестве базового типа для AnyInt64 + проверка на null может работать.

+0

Я добавил преобразование из 'Float', поскольку это обычный тип при создании объектов с большими номерами JSON. – meps

Смежные вопросы