在 Haxe 中将 Int 转换为 Int64
Casting Int to Int64 in Haxe
当我将原始 Int
类型设置为 Int64
时,它工作正常。我什至可以在补充 class ___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
-- 我有一个错误:
TypeError: Error #1034: Type Coercion failed: cannot convert 1111 to haxe._Int64.___Int64.
当然我可以检查字段的类型并从 Int
正确实例化一个 Int64
。但是是否有一个巧妙的解决方案来自动进行类型转换?
您可以使用 Dynamic
中的 abstract type with implicit casts(openfl.utils.Object
的数组访问获取的 return 值)来抽象检查。
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
可能有效。
当我将原始 Int
类型设置为 Int64
时,它工作正常。我什至可以在补充 class ___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
-- 我有一个错误:
TypeError: Error #1034: Type Coercion failed: cannot convert 1111 to haxe._Int64.___Int64.
当然我可以检查字段的类型并从 Int
正确实例化一个 Int64
。但是是否有一个巧妙的解决方案来自动进行类型转换?
您可以使用 Dynamic
中的 abstract type with implicit casts(openfl.utils.Object
的数组访问获取的 return 值)来抽象检查。
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
可能有效。