在 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" 字段的值是 IntInt64 -- 我有一个错误:

TypeError: Error #1034: Type Coercion failed: cannot convert 1111 to haxe._Int64.___Int64.

当然我可以检查字段的类型并从 Int 正确实例化一个 Int64。但是是否有一个巧妙的解决方案来自动进行类型转换?

您可以使用 Dynamic 中的 abstract type with implicit castsopenfl.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"];

您需要找到一种好的方法来处理尝试转换,但不是 IntInt64(除非您只使用这两种类型)。使用 Null<Int64> 作为 AnyInt64 的基础类型 + 检查 null 可能有效。