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