Kotlin: можете ли вы объяснить функции расширения члена?

Мой код выглядит следующим образом:

open class Particle class Electron : Particle() open class Element(val name: String) { open fun Particle.react(name: String): Unit { println("$name is reacting with a particle") } open fun Electron.react(name: String): Unit { println("$name is reacting with an electron") } fun react(particle: Particle): Unit { particle.react(name) } } fun main(args: Array<String>) { val selenium = Element("Selenium") selenium.react(Particle()) selenium.react(Electron()) } 

Мой выход выглядит следующим образом:

Селен взаимодействует с частицей

Селен взаимодействует с частицей

Я не понимаю: почему второй выход не должен быть «Селен реагирует с электроном»?

Если я добавил еще один подкласс

 class NobleGas(name: String) : Element(name) { fun react(particle: Electron): Unit { particle.react(name) } } fun main(args: Array<String>) { val neon = NobleGas("Selenium") neon.react(Particle()) neon.react(Electron()) } 

Выход: Селен взаимодействует с частицей. Селен взаимодействует с электроном

Почему второй выход «Селен реагирует с электроном»?

    Функции расширения собираются для статических вызовов функций, и поэтому метод вызова определяется статическими типами времени компиляции вместо типов времени выполнения объектов.

    Здесь нет динамической отправки, как вы получаете, когда вы вызываете метод, который переопределяется в подклассе, и вы получаете эту реализацию вместо того, что находится в базовом классе. В принципе, нет никаких дополнительных функций расширения.

    К конкретному примеру: во время компиляции внутри функции react(particle: Particle) статический тип particle – это просто Particle во время компиляции, поэтому он всегда будет вызывать функцию расширения, определенную в классе Particle .