Я пытаюсь смоделировать двойную диспетчеризацию следующим образом:
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)
.Но если я удаляю этот метод, то вызывается get_thing(t:Thing)
.
Какова семантика языка, которая отдает приоритет методам с конкретными типами (а не универсальными)?
Является ли это частным случаем динамического (во время выполнения) полиморфизма?