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