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>()
。
我的 EntitySystem
和 Component
实现是用 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 引用。
我在 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
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 引用。