我正在用Kotlin写作,为Android开发基于文本的RPG游戏。 我目前正在与策略/实体组件设计一起开发对象系统。 我卡在getComponent函数上,不知道我在做什么
我需要一个方法,该方法接受对Class类型的引用,然后将其与所有组件实例的Class类型进行比较。
我尝试使用泛型,KClass,Java Type,但找不到答案。
我的主要问题是“ as”运算符。我不知道它接受什么。
到目前为止,我得到的只是:
fun getComponent(clazz : KClass<*>) : Component? {
for(component in components) {
if(component is clazz) {
return component
}
}
return null
}
此代码是错误的。 IntelliJ提醒我,clazz不存在,因为它不是实际的Class。
答案 0 :(得分:0)
您有一个KClass
实例,它是一个表示类型的运行时对象,用于反射。您在这里有两个主要选择。您可以像这样使用reified generics,从而避免完全使用反射:
inline fun <reified T : Component> getComponent() : T? {
for(component in components) {
if(component is T) {
return component
}
}
return null
}
可以像这样调用该方法:
getComponent<SomeClass>()
或者,您可以使用KClass.isInstance:
fun getComponent(clazz : KClass<*>) : Component? {
for(component in components) {
if(clazz.isInstance(component)) {
return component
}
}
return null
}
您也可以通过泛型和强制转换使此操作更加方便:
fun <T : Component> getComponent(clazz : KClass<*>) : T? {
for(component in components) {
if(clazz.isInstance(component)) {
return component as T
}
}
return null
}
这两种用法都相同:
getComponent(SomeClass::class)