Kotlin 反射问题

Kotlin Reflection Issue

我在 Java 库中声明了这些方法:

Engine.java:

public <T extends EntitySystem> T getSystem(Class<T> systemType)

Entity.java:

public <T extends Component> T getComponent(Class<T> componentClass)

现在,我经常使用这些方法,我真的很想使用 MyComponent::class(即 kotlin 反射)而不是到处都使用更冗长的 javaClass<MyComponent>()

我的 EntitySystemComponent 实现是用 Kotlin 编写的。

所以我想我会创建采用 KClasses 的扩展函数,但我不太确定如何让它们工作。

类似于...

public fun <C : Component> Entity.getComponent(type: KClass<out Component>): C {
    return getComponent(type.javaClass)
}

但是由于以下几个原因这不起作用:编译器说类型推断失败,因为 javaClass returns Class<KClass<C>>。我需要 Class<C>。我也不知道如何使该方法正确通用。

谁能帮我创建这些方法?

您应该使用扩展名 属性 java 而不是 javaClass

此外,您可以使用 reified type parameters 改进您的 API 并重写您的代码,例如:

public inline fun <reified C : Component> Entity.getComponent(): C {
    return getComponent(C::class.java)
}

在当前的 Kotlin (1.0) 中,代码会更简单:

public inline fun <reified C : Component> Entity.getComponent(): C {
    return getComponent(C::class)
}

并且可以调用:

val comp: SomeComponent = entity.getComponent()

在类型推断起作用的地方,具体化泛型类型参数(包括任何嵌套的泛型参数)并调用方法,然后使用类型参数作为 class 引用。