kotlin - 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
]
为什么两种实现都会生成完全不同的字节码?我认为至少方法重载的数量应该是相同的
解决方案
推荐阅读
- php - WooCommerce:当免费送货可用时,隐藏除本地取货外的其他送货方式
- python - 如何解决 Pandas 合并错误:键必须是整数或时间戳?
- reactjs - 如何将其转换为使用我已经到位的代码?
- c# - URL 中页面名称后所有路径的 ASP.NET Core Razor 页面端点路由
- text-files - 如何删除打印的文本文件中的引号
- angular - Angular http get 请求什么也不做
- php - 在 Google Cloud 中使用 Laravel 8 的 Docker 容器的 503“服务不可用”
- c - 如何监控文件系统路径名在 C 或 inotify 中被重命名?
- python - 如何删除多个文件名中的所有空格?
- python - 从具有特定 id 的 div 开始获取嵌套的 div 内容