import kotlin.test.assertEquals

abstract class A<R> {
    abstract fun f(): String
    override fun toString() = f()
}

abstract class G {
    abstract fun bar(): Any
}

inline fun<reified T> foo(): G {
    return object : G() {
        override fun bar(): Any {
            return object : A<T>() {
                 override fun f(): String = "OK"
            }
        }
    }
}

fun box(): String {
    val y = foo<String>().bar();
    assertEquals("OK", y.toString())
    assertEquals("A<java.lang.String>", y.javaClass.getGenericSuperclass()?.toString())
    return "OK"
}
