Как я могу использовать тип класса и его производные как общий ключ и значение для коллекций? - PullRequest
0 голосов
/ 04 июля 2019

извините, если здесь уже есть решение, не могу его найти.

Я хочу использовать карту / словарь для хранения списков компонентов. Все компоненты наследуются от одного и того же класса. Поэтому, чтобы сохранить порядок, я хочу использовать класс в качестве ключа и иметь только компоненты этого класса в правильном списке:

private val components : Map<KClass<T : IComponent>, List<T>>

Пример кода:

class GameObject
{
    val components : ObjectMap<KClass<out IComponent>, Array<*>> = ObjectMap()

    fun update(deltaTime: Float)
    {
        for(componentFamily in components.values())
        {
            for(component in componentFamily)
            {
                component.update(deltaTime)
            }
        }
    }

    inline fun <reified T : IComponent> get() : T?
    {
        return components.get(T::class)[0] // This does not work - it returns Any?, not T?
    }
}

То, что делает то, что пытается сделать мой код. Я знаю, что это неправильно, но надеюсь, что вы поняли идею.

Ключи: классы, наследуемые от IComponent Значения: объекты того же типа, что и ключ, под которым они находятся.

Спасибо, что посмотрели:)

...