我有一个内联函数,带有一个带有lambda的reified类型参数,它返回一个匿名类的新实例,该实例有一个方法获取该reified类型参数并将其传递给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的虚拟方法等)?