我有一个内联函数,带有一个带有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的虚拟方法等)?