【问题标题】:Generics class method taking function parameter of the generic type doesn't work with Void采用泛型类型的函数参数的泛型类方法不适用于 Void
【发布时间】:2014-11-20 15:55:22
【问题描述】:

我遇到了一个对我来说似乎很奇怪的 Haxe 问题。这是一个错误吗?

当使用将泛型类型的函数作为参数的方法创建泛型类时,我得到了奇怪的错误

Void -> Void 应该是 (Void) -> Void

当泛型类型为 Void 时

如果泛型类型是 Int 则可以正常工作。

有没有人有任何想法来解决或解决这个问题?

Playground link

class Test {
    static var test2:Test2<Void> = new Test2<Void>();
    static public function main() {
        test2.test(passedFunc);
    }

    static function passedFunc():Void {
        trace("passedFunc");
    }
}

class Test2<T> {
    public function new():Void {}

    public function test(func: T->Void) {
        trace("Test2.testFunc(T)");
    }
}

【问题讨论】:

    标签: generics haxe


    【解决方案1】:

    您可以欺骗类型推断以几乎忽略缺少的参数,如下所示:

    class Test {
        static var test2 = new Test2();
        static public function main() {
            test2.test(passedFunc);
        }
        static function passedFunc(?unused):Void {
            trace("passedFunc");
        }
    }    
    class Test2<T> {
        public function new():Void {}
        public function test(func: T->Void) {
            trace("Test2.testFunc(T)");
        }
    }
    

    【讨论】:

      【解决方案2】:

      我不确定这是一个错误,它可能只是与类型系统在 Haxe 中的工作方式有关。在任何情况下,您可以使用的一种解决方法是简单地使用一个函数,其中参数显式类型为Void-&gt;Void,并在必要时在类的其他函数中使用您的参数化类型T

      【讨论】:

        【解决方案3】:

        解决方法:

        static public function main() {
            test2.test(cast passedFunc);
        }
        

        Playground link.

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-04
          相关资源
          最近更新 更多