class Base
和class 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的类型参数的隐式转换?
答案 0 :(得分:2)
有三种方法可以解释和回答您的问题:
foo(v:B<T>)
这是your example并且它没有编译,因为T
不允许变体。这是因为foo
的存在,并且因为允许bBase.foo(bExt)
,即将bExt
与bBase
统一,将允许bBaseOfbExt.foo(bBase)
。
事实上foo
存在,并且它可能会修改使bExt
与bBase
统一的类型不安全的类型;您可以在手册中看到类似(但可能更清晰)的解释,使用数组:type system – variance。
foo(v:T)
这更接近问题正文中的内容(但不在示例中),并且它有效fine。
foo<A>(v:B<A>)
最后,如果您有类型参数化方法,它也是works,但您可能在其他地方遇到其他差异问题。