gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 06:02:47 24 4
gpt4 key购买 nike

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

inline fun <reified T : Any> eventHandler(crossinline handler: (T) -> Unit) = object {
@Handler
fun event(event: T) = handler(event)
}

它的用法类似于 eventHandler<ExampleEvent> { println(it.data); }一切都编译。

然而,调查在上述调用中创建的类的生成字节码,我得到了这个事件方法:
public final void event(example.ExampleEvent);
descriptor: (Ljava/lang/Object;)V
[...]
Signature: #53 // (Lexample.ExampleEvent;)V

因此,虽然它正确地记住了签名中的类型,但它在描述符中丢弃了它;因此 thatEventMethod.getParameterTypes()将有 Object而不是 ExampleEvent .

这是错误还是预期行为?此外,如果这是有意的,是否还有其他方法可以实现我的目标(即防止必须在任何地方创建那个笨拙的对象,使用 @Handler 添加一个虚拟方法等)?

最佳答案

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

答案是"is"。这就是为什么具有具体泛型的函数只能双向内联。他们的 body 正在完全内联到调用者中。当然类型不会在那里被删除(以膨胀调用函数字节码大小为代价)。

关于Kotlin 将类型参数具体化为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43525608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com