Kotlin不一致地生成SAM存根

时间:2019-02-16 19:56:28

标签: kotlin functional-interface

例如,我有一个功能界面:

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
]

为什么两种实现都生成完全不同的字节码?我认为至少方法重载的数量应该相同

0 个答案:

没有答案