Что ж, ваше предположение правдоподобно, и есть языки, на которых это сработало, как вы думали.
Так выглядит ли ваш код так:
Session s = new LateSession(); // the compiler only "knows" that s is of type Session
StoreSessionSpecific(s);
или это выглядит так:
LateSession ls = new LateSession(); // the compiler knows that ls is in fact a LateSession
StoreSessionSpecific(ls);
В первом примере компилятор делает вид, что не знает, что представляет собой фактический тип "s", и жестко кодирует вызов метода с аргументом Session.
Во втором примере аналогичным образом компилятор генерирует жестко закодированный вызов другого метода.
В других языках вызов метода является «динамическим», что означает, что во время выполнения учитываются все типы актуальных действий. Методы, которые полиморфны в своих аргументах, называются «мультиметодами» (они полиморфны не только в классе, в котором они определены, но и в аргументах, следовательно, «мульти»)
(Редактировать: исправлены опечатки)