首页 > 解决方案 > Kotlin 不一致地生成 SAM 存根

问题描述

例如,我有一个功能接口:

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
]

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

标签: kotlinfunctional-interface

解决方案


推荐阅读