| # Anonymous objects in inline functions. | |
| There are two different cases of interaction between inline functions and anonymous objects. | |
| ## Anonymous object inside inline function | |
| ```kotlin | |
| inline fun <reified T> foo(crossinline block: () -> Unit) { | |
| val simple = object {} | |
| val complex = object { | |
| fun foo() = block() | |
| } | |
| val anotherComplex = object { | |
| fun foo() : T? = null | |
| } | |
| } | |
| fun callSite1() { | |
| foo<Int> { println("1") } | |
| } | |
| fun callSite2() { | |
| foo<String> { println("2") } | |
| } | |
| ``` | |
| Here, we can create one class for `simple` object, but must create a class per call-site | |
| for `complex` and `anotherComplex`. Language semantics allows us simple objects on different call-sites | |
| be both same and different. | |
| JVM makes this single class as an optimization, if both functions defined in one module. | |
| Other backends always copy classes in such a case. | |
| ## Anonymous object inside lambda passed to inline function | |
| ```kotlin | |
| inline fun <T> runTwice(block: () -> T) : Pair<T, T> { | |
| return block() to block() | |
| } | |
| fun main() { | |
| val x = runTwice { | |
| object { | |
| fun run() { } | |
| }::class | |
| } | |
| require(x.first == x.second) | |
| } | |
| ``` | |
| In that case, language semantics require us to have a single class. |