interface A { fun id(t: T): T } open class B : A { override fun id(t: String) = t } class C : B() class D : A by C() fun box(): String { val d = D() if (d.id("") != "") return "Fail" val a: A = d return a.id("OK") }