Котлин генерирует заглушки SAM непоследовательно - PullRequest
0 голосов
/ 16 февраля 2019

Например, у меня есть функциональный интерфейс:

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
]

Почему обе реализации генерируют полностьюдругой байт-код?Я думал, что по крайней мере количество перегрузок метода должно быть одинаковым

...