open class A { open fun foo(t: T) = "A" } open class B : A() class Z : B() { override fun foo(t: Int) = "Z" } fun box(): String { val z = Z() return when { z.foo(0) != "Z" -> "Fail #1" (z : B).foo(0) != "Z" -> "Fail #2" (z : A).foo(0) != "Z" -> "Fail #3" else -> "OK" } }