我正在尝试像这样模拟双重调度:
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)
。
优先使用具有具体类型(而不是泛型)的方法的语言的语义是什么?
这是动态(运行时)多态性的特例吗?
答案 0 :(得分:0)
这是类型提升的规则。 在函数重载中,首先编译器搜索完全匹配。如果找到完全匹配,则它将该函数绑定到函数调用。 如果找不到完全匹配的内容,则立即不显示错误,首先将传递的参数提升为下一级超级类型。 现在,通过提升是否找到完全匹配来进行绑定,然后进行绑定,如果没有找到则再次提升为下一级超级类型。 重复此过程,直到Grand超级类型 Any 。如果仍然找不到任何匹配项,则只有编译器显示错误。