类型参数的统一和隐式转换

时间:2015-10-26 10:39:20

标签: haxe unification

class Baseclass Ext extends Base。 使用类型化方法class B<T>

foo<T>(value:T)

为什么B<Base>.foo默认情况下不接受B<Ext>的实例(隐式向下转换类型参数?)?

这是一个例子 http://try.haxe.org/#d443f

class Test {
    static function main() {

        var bExt = new B(new Ext());
        var bBase = new B(new Base());

        bBase.foo(bExt);
        //ofc 
        //bBase.foo(cast bExt);
    }
}

class B<T>
{
   public function new(v:T)
   {
   }

   public function foo(v:B<T>)
   {
      //  
   }
}

class Base {
    public function new(){}
}
class Ext extends Base {
    public function new(){
        super();
    }
}

有没有办法触发B.foo的类型参数的隐式转换?

1 个答案:

答案 0 :(得分:2)

有三种方法可以解释和回答您的问题:

1。 foo(v:B<T>)

这是your example并且它没有编译,因为T不允许变体。这是因为foo的存在,并且因为允许bBase.foo(bExt),即将bExtbBase统一,将允许bBaseOfbExt.foo(bBase)

事实上foo存在,并且它可能会修改使bExtbBase统一的类型不安全的类型;您可以在手册中看到类似(但可能更清晰)的解释,使用数组:type system – variance

2。 foo(v:T)

这更接近问题正文中的内容(但不在示例中),并且它有效fine

3。 foo<A>(v:B<A>)

最后,如果您有类型参数化方法,它也是works,但您可能在其他地方遇到其他差异问题。