Reflection Haxe中Type.createInstance的奇怪行为

Reflection Haxe中Type.createInstance的奇怪行为,reflection,types,haxe,Reflection,Types,Haxe,下面的代码不应该抛出错误而不是执行错误吗 class Weird { public static function main() { var weirdPerson = Type.createInstance(Person,[["What", "the", "?"]]); trace(weirdPerson.likesCake); // Outputs [What,the,?] var normalPerson =

下面的代码不应该抛出错误而不是执行错误吗

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;
    }
}
错误的类型被解析为怪人的构造函数,但它仍然被接受。怪人的Bool属性'likesCake'实际上被分配了一个字符串数组!?这里是否有问题,或者这是预期的功能?可能likesCake属性的类型在运行时仅针对Person类的此实例从Bool更改为Array?

来自以下文档:

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

基本上,当您在Haxe中使用反射(类型
Type
Reflect
类)时,Haxe编译器不能保证捕获任何类型错误。在本例中,
createInstance()
的第二个参数类型为
Array
——它将接受任何类型的数组,并且不进行任何检查

在动态平台上,比如Javascript或Neko,它们可能会让您侥幸逃脱,并且您会遇到您所看到的那种错误。在静态平台(C++、Java、Flash?)上,底层平台可能会在运行时拒绝此操作。因为Haxe在平台之间不做任何保证,所以它被称为“unspecified”,您应该小心使用您的参数


这些“动态”反射参数可能会导致Haxe编译器无法跟踪的非常令人沮丧的错误,因此在使用这些函数时要小心。。。(我昨天花了两个小时才找到一个!)

+1。避免像瘟疫一样的反射。它会导致难以跟踪bug,尤其是在消除死代码的同时。