Kotlin как создать кеш с объектами, расширяющими один базовый класс - PullRequest
0 голосов
/ 21 июня 2020

Я ломаю себе голову, и я не смог придумать решение для этого. Я читал Generics в Kotlin и пытался что-то сделать, но не смог узнать.

У меня базовый интерфейс A. B и C - это интерфейсы, наследующие A. ObjB фактически наследует B и реализует методы. Я пытаюсь создать кеш объектов, расширяющих A, и использовать извлечение, чтобы различать объекты B и C. К сожалению, я не смог добиться большого прогресса. Я пробовал использовать out в A, но это привело к другим проблемам.

interface A<T> {
    fun value() : String
}

interface B : A<B> {
    fun valueB() : String
}

interface C : A<C> {
    fun valueC() : String
}

class ObjB : B {
    override fun value() : String {
        return "B"
    }
    override fun valueB() : String {
        return "objB"
    }
}

class AllTogether {
   val cache : ConcurrentHashMap<String, A<Any>> = ConcurrentHashMap()
   
   fun retrieveB(val: String) : B {
       // return cache.get(val)
   }
}

1 Ответ

1 голос
/ 21 июня 2020

Параметр Generi c в интерфейсах никогда не используется, поэтому его можно удалить:

interface A {
    fun value() : String
}

interface B : A {
    fun valueB() : String
}

interface C : A {
    fun valueC() : String
}

class ObjB : B {
    override fun value(): String {
        return "B"
    }
    override fun valueB(): String {
        return "objB"
    }
}


class AllTogether {
    val cache: ConcurrentHashMap<String, A> = ConcurrentHashMap()

    fun retrieveB(key: String): B? {
        return cache[key] as? B
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...