当我设置了原始Int
类型的Int64
它工作正常。我甚至可以赶上补习班___Int64
接受两个Int
值的构造方法 - 高和低。看来,这个转换是静态的,甚至这样的代码工作完美:
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
的价值 - 我有一个错误:
类型错误:错误#1034:类型强制失败:不能转换1111 haxe._Int64 .___的Int64。
当然,我可以检查该字段的类型和正确实例从Int64
的Int
。但有一个整洁的解决方案来自动类型转换?
你可以使用一个abstract type从implicit casts Dynamic
(openfl.utils.Object
的数组访问GET的返回值),以抽象的检查了。
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
可能会奏效。