interface A { fun foo(t: T, u: U) = "A" } interface B : A interface C : A class Z : B, C { override fun foo(t: String, u: Int) = "Z" } fun box(): String { val z = Z() val c: C = z val b: B = z val a: A = z return when { z.foo("", 0) != "Z" -> "Fail #1" c.foo("", 0) != "Z" -> "Fail #2" b.foo("", 0) != "Z" -> "Fail #3" a.foo("", 0) != "Z" -> "Fail #4" else -> "OK" } }