Например, у меня есть функциональный интерфейс:
public interface SomeInt<R, P> {
R execute(P param);
}
Позже я хочу передать его в качестве параметра, поэтому я создаю встроенную реализацию
//implementation 1
val someInt = SomeInt { id: Int? -> "param $id" }
//implementation 2
val someFun = { id: Int? -> "param $id" }
val someInt2: SomeInt<String, Int> = SomeInt(someFun)
Приведенный выше код генерирует две разные реализации. Я не уверен, где посмотреть, но вот что привлекло мое внимание:
println(someInt.javaClass.name)
println(someInt2.javaClass.name)
println(someInt.javaClass.methods.filter { it.name == "execute" }.map { "${it.name} ${it.returnType} ${it.parameterTypes.map { it.name }} ${it.parameters[0].name}\n" })
println(someInt2.javaClass.methods.filter { it.name == "execute" }.map { "${it.name} ${it.returnType} ${it.parameterTypes.map { it.name }} ${it.parameters[0].name}\n" })
вывод:
my.test.TestKt$main$someInt$1
my.test.TestKt$sam$my_test_SomeInt$0
[execute class java.lang.String [java.lang.Integer] arg0
, execute class java.lang.Object [java.lang.Object] arg0
]
[execute class java.lang.Object [java.lang.Object] arg0
]
Почему обе реализации генерируют полностьюдругой байт-код?Я думал, что по крайней мере количество перегрузок метода должно быть одинаковым