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