Kotlin将类型参数作为函数参数
我有一个内置的函数,带有一个带有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); }
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等添加一个虚拟方法)?