编译器如何确定在双调度中调用哪种方法?

时间:2019-04-26 12:16:35

标签: kotlin polymorphism double-dispatch

我正在尝试像这样模拟双重调度:

Hero hero = (Hero) getIntent().getSerializableExtra("hero");
hero.incxp();

照原样,调用的方法是interface Thing { fun do_stuff() } class Foo:Thing{ override fun do_stuff() { println("doing foo"); } } fun get_thing(t:Thing) { println("using generic thing") } fun get_thing(f:Foo) { println("using concrete foo") } fun main(args: Array<String>) { val f = Foo() get_thing(f); } 。但是,如果我删除此方法,则会调用get_thing(f:Foo)

优先使用具有具体类型(而不是泛型)的方法的语言的语义是什么?

这是动态(运行时)多态性的特例吗?

1 个答案:

答案 0 :(得分:0)

这是类型提升的规则。 在函数重载中,首先编译器搜索完全匹配。如果找到完全匹配,则它将该函数绑定到函数调用。 如果找不到完全匹配的内容,则立即不显示错误,首先将传递的参数提升为下一级超级类型。 现在,通过提升是否找到完全匹配来进行绑定,然后进行绑定,如果没有找到则再次提升为下一级超级类型。 重复此过程,直到Grand超级类型 Any 。如果仍然找不到任何匹配项,则只有编译器显示错误。