我在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>()
。
我的EntitySystem
和Component
实现是用Kotlin编写的。
所以我认为我会创建以KClasses
代替的扩展函数,但我不太确定如何让它们工作。
有些事情......
public fun <C : Component> Entity.getComponent(type: KClass<out Component>): C {
return getComponent(type.javaClass)
}
但是这不起作用有几个原因:编译器说类型推断失败,因为javaClass
返回Class<KClass<C>>
。我需要Class<C>
。我也不知道如何使方法正确通用。
有人可以帮我创建这些方法吗?
答案 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)
}