Я пытаюсь реализовать простой сервисный локатор в Kotlin, основанный на этой статье , за исключением того, что я хочу использовать параметры универсального типа.Я также пытаюсь избежать встраивания функций с параметрами типа reified, потому что для этого требуется, чтобы все было общедоступным.
Этот класс отвечает за кэширование экземпляров расположенных служб:
class Cache {
private val services: MutableList<Any> = mutableListOf()
fun <T> getService(serviceClass: Class<T>): T? {
val service = services.firstOrNull { s -> s::class.java == serviceClass }
if (service != null) {
return service as T
}
return null
}
fun addService(service: Any) {
services.add(service)
}
}
Этокак вызывается кеш:
cache.getService(IMyService::class)
Возвращает ноль каждый раз, независимо от того, содержит ли он экземпляр MyService
или нет.Проблема в s::class.java == serviceClass
, потому что во время выполнения кеш содержит экземпляр MyService
, а MyService::class.java
не эквивалентен IMyService::class
(и MyService::class
- я тоже это пробовал).
Я попытался изменить метод getService
следующим образом:
fun <T> getService(): T? {
val service = services.firstOrNull { s -> s is T }
if (service != null) {
return service as T
}
return null
}
На s is T
компилятор жалуется: «Не удается проверить экземпляр стертого типа: T».Как я могу сделать эту работу без встраивания, что потребовало бы публикации списка услуг?