例如,我有一个功能界面:
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
]
为什么两种实现都生成完全不同的字节码?我认为至少方法重载的数量应该相同