Kotlin将类型参数具体化为函数参数

Kotlin将类型参数具体化为函数参数,kotlin,Kotlin,我有一个内联函数,其中一个具体化类型参数采用lambda,它返回一个匿名类的新实例,该匿名类有一个方法采用该具体化类型参数并将其传递给lambda inline fun <reified T : Any> eventHandler(crossinline handler: (T) -> Unit) = object { @Handler fun event(event: T) = handler(event) } 因此,当它正确地记住签名中的类型时,它会在描述

我有一个内联函数,其中一个具体化类型参数采用lambda,它返回一个匿名类的新实例,该匿名类有一个方法采用该具体化类型参数并将其传递给lambda

inline fun <reified T : Any> eventHandler(crossinline handler: (T) -> Unit) = object {
    @Handler
    fun event(event: T) = handler(event)
}
因此,当它正确地记住签名中的类型时,它会在描述符中丢弃它;因此,
thatEventMethod.getParameterTypes()
将具有
对象,而不是
ExampleEvent


这是一个bug还是预期的行为?此外,如果这是有意的,是否还有其他方法来实现我的目标(即防止到处创建笨拙的对象,添加带有@Handler等的虚拟方法)?

因此,如果我理解正确,您的问题是:字节码中具有具体泛型的函数看起来像具有擦除类型的函数,这样可以吗


答案是肯定的。这就是为什么具有具体化泛型的函数只能双向内联。他们的身体被完全内联到呼叫者身上。当然,类型不会在那里被删除(代价是调用函数字节码大小膨胀)。

为什么
T
被具体化?这在您的代码中不应该是必需的,除非这只是一个简化的示例,并且您的实际代码使用了具体化。。所以你不需要对象文字。(虽然会有一个桥接方法,但它没有那个注释,所以没关系)我不确定这是一个bug还是有意的。你最好把票归档,在我看来这是个错误。事实上,请提交YouTrack问题。问题恰恰是,在内联之后,类型仍然(曾经?)被部分删除。
public final void event(example.ExampleEvent);
    descriptor: (Ljava/lang/Object;)V
    [...]
    Signature: #53 // (Lexample.ExampleEvent;)V