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

Unification and implicit cast of the type parameter

class Baseclass Ext extends Baseclass 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。 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,但您可能会在其他地方遇到其他差异问题。