import kotlin.test.assertEquals abstract class A { abstract fun f(): String override fun toString() = f() } abstract class G { abstract fun bar(): Any } inline fun baz(): G { return object : G() { override fun bar(): Any { return object : A() { override fun f(): String = "OK" } } } } inline fun foo(): Pair { return Pair(baz(), baz()) } fun box(): String { val res = foo(); val x1 = res.first.bar() val x2 = res.second.bar() assertEquals("OK", x1.toString()) assertEquals("OK", x2.toString()) assertEquals("A", x1.javaClass.getGenericSuperclass()?.toString()) assertEquals("A", x2.javaClass.getGenericSuperclass()?.toString()) return "OK" }