interface I { val prop: T fun f(x: String = "1"): String fun g(x: String = "2"): String fun h(x: T = prop): T } interface I2 : I open class A { open fun f(x: String) = x open fun g(x: T) = x open fun h(x: String) = x } class B : A(), I2 { override val prop get() = "3" } fun box(): String { val i: I = B() var result = i.f() + i.g() + i.h() if (result != "123") return "fail1: $result" val b = B() result = b.f() + b.g() + b.h() if (result != "123") return "fail2: $result" val a: A = B() result = a.f("q") + a.g("w") + a.h("e") if (result != "qwe") return "fail3: $result" return "OK" }