Haxe中Type.createInstance的奇怪行为

时间:2014-07-29 06:52:03

标签: reflection types haxe

以下代码是否应该抛出错误而不是执行?

class Weird
{
    public static function main()
    {
        var weirdPerson = Type.createInstance(Person,[["What", "the", "?"]]);
        trace(weirdPerson.likesCake);
        // Outputs [What,the,?]

        var normalPerson = Type.createInstance(Person,[true]);
        trace(normalPerson.likesCake);
        // Outputs John Doe
    }
}


class Person
{
    public var likesCake:Bool;

    public function new(?likesCake:Bool=true)
    {
        this.likesCake = likesCake;
    }
}

错误的类型被解析为weirdPerson的构造函数但仍然被接受。 Bool物业' likesCake'怪异的Person实际上被分配了一个String数组!?这里有什么问题或这是预期的功能吗?也许对于Person类的这个实例,likesCake属性的类型在运行时从Bool更改为Array?

1 个答案:

答案 0 :(得分:2)

来自Type.createInstance的文档:

  

如果cl或args为null,或者args中的元素数与预期的构造函数参数数不匹配,或者任何参数的类型无效,或者cl没有自己的构造函数,则结果未指定。

基本上,当您在Haxe(TypeReflect类)中使用反射时,Haxe编译器无法捕获任何类型错误。在这种情况下,createInstance()的第二个参数被输入为Array<Dynamic> - 它将接受任何类型的数组,并且不进行任何检查。

在动态平台上,比如Javascript或Neko,它们可能会让你逃脱这种情况,并且会遇到像你一样的错误。在静态平台(C ++,Java,Flash?)上,底层平台可能会在运行时拒绝此操作。因为Haxe并没有在平台之间做出任何保证,所以它被称为&#34;未指定&#34;你应该小心你的论点。

这些&#34;动态&#34;反射参数可能会导致Haxe编译器无法访问的非常令人沮丧的错误,因此每当使用这些函数时都要小心......(我在昨天跟踪之前花了2个小时!)