如何在Kotlin中为视频游戏实现getComponent(/ * Class * /)方法

时间:2018-12-12 16:51:22

标签: kotlin

我正在用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。

1 个答案:

答案 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)