class Test { private fun T.self() = object { fun bar(): T { return this@self } } fun test() { 1.self().bar() + 1 } } class Foo { private fun bar() = object { fun baz(): Foo { return this@Foo } } fun getR(r: R) = r fun test() { Foo().bar().baz().getR(1) Foo().bar().baz().getR("") } }