下記のようなコードがあるとします。

interface HasAnalogStick {
    fun lowerStick()
}
interface GameConsole

object WiiU : GameConsole, HasAnalogStick {
    override fun lowerStick() { /* スティックを倒す */ }
}
object NintendoSwitch : GameConsole, HasAnalogStick {
    override fun lowerStick() { /* スティックを倒す */ }
}

fun randomGameConsole() = listOf(WiiU, NintendoSwitch).random()

fun main() {
    val console = randomGameConsole()
    println(console.toString() + ": lower stick")
    (console as HasAnalogStick).lowerStick()
}

https://pl.kotl.in/bqS8bIsil

このコードはコンパイルが通り、実行可能ですし、fun randomGameConsole()でWiiUが返って来てもNintendoSwitchが返ってきてもメイン関数内の処理も全て実行されます。

のちにリファクタが必要になりobject Famicomとobject SuperFamicomが追加されたとします。

interface HasAnalogStick {
    fun lowerStick()
}
interface GameConsole

object Famicom : GameConsole
object SuperFamicom : GameConsole
object WiiU : GameConsole, HasAnalogStick {
    override fun lowerStick() { /* スティックを倒す */ }
}
object NintendoSwitch : GameConsole, HasAnalogStick {
    override fun lowerStick() { /* スティックを倒す */ }
}

fun randomGameConsole() = listOf(Famicom, SuperFamicom, WiiU, NintendoSwitch).random()

fun main() {
    val console = randomGameConsole()
    println(console.toString() + ": lower stick")
    (console as HasAnalogStick).lowerStick()
}

https://pl.kotl.in/7sJJg3HCT

このコードだとどうでしょうか?コンパイルが通るので一見良さそうに見えますが、実行時にfun randomGameConsole()でFamicomまたはSuperFamicomが返されるとそれらはHasAnalogStickを継承していないので、実行時エラーになります。実行しないとわからないエラーがあるのは良くないコードです。このような実行しないとわからないエラーを無くすにはfun randomGameConsole()の戻り値の型を書くようにしましょう。fun randomGameConsole(): HasAnalogStickと宣言すればコンパイル時にエラーとなるのでコードを実行しなくてもエラーがあることがわかります。

Kotlinでは関数の戻り値の型は省略することは可能ですが、特に理由が無いのであれば戻り値の型を書きましょう。