// abstract bridge interface A { fun foo(): T } abstract class B: A abstract class C: B() class D: C() { override fun foo(): Int { return 42 } } fun main(args: Array) { val d = D() val c: C = d val b: B = d val a: A = d println(d.foo()) println(c.foo()) println(b.foo()) println(a.foo()) }