科特林反思问题

时间:2015-04-19 12:47:42

标签: java reflection kotlin

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

Engine.java:

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

Entity.java:

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

现在,我使用这些方法A LOT,我真的想使用MyComponent::class(即kotlin反射)而不是更详细的javaClass<MyComponent>()

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

所以我认为我会创建以KClasses代替的扩展函数,但我不太确定如何让它们工作。

有些事情......

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

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

有人可以帮我创建这些方法吗?

2 个答案:

答案 0 :(得分:2)

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

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

可以称之为:

val comp: SomeComponent = entity.getComponent()

在类型推断可行的情况下,重新设置泛型类型参数(包括任何嵌套的泛型参数)并调用该方法,然后使用type参数作为类引用。

答案 1 :(得分:1)

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

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

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