Kotlin反射问题
我有这些方法在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>()
。
我的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>
。 我也不知道如何使方法正确通用。
任何人都可以帮我创建这些方法吗?
您应该使用扩展属性java
而不是javaClass
。
另外,您可以使用指定的类型参数来改进您的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()
在类型推断可以工作的地方,通用类型参数(包括任何嵌套的泛型参数),并调用方法,然后使用类型参数作为类的引用。