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>()

我的EntitySystemComponent实现是用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() 

在类型推断可以工作的地方,通用类型参数(包括任何嵌套的泛型参数),并调用方法,然后使用类型参数作为类的引用。