Как компилятор решает, какой метод вызывать в двойной диспетчеризации? - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь смоделировать двойную диспетчеризацию следующим образом:

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).

Какова семантика языка, которая отдает приоритет методам с конкретными типами (а не универсальными)?

Является ли это частным случаем динамического (во время выполнения) полиморфизма?

1 Ответ

0 голосов
/ 26 апреля 2019

Это правило продвижения по типу.При перегрузке функции первый поиск компилятора для точного соответствия.если точное совпадение найдено, оно связывает эту функцию с вызовом функции.Если он не находит точное совпадение, то сразу же не показывает ошибку, сначала он продвигает переданный аргумент до супертипа следующего уровня.Теперь, повышая, если он находит точное совпадение, затем связывается, а если нет, то снова продвигается к следующему уровню супертипа.Этот процесс повторяется до тех пор, пока Grand super type Any .Если по-прежнему не удается найти совпадение, то только компилятор показывает ошибку.

...