Nano Hash - криптовалюты, майнинг, программирование

Простой локатор сервисов с параметрами универсального типа в Kotlin

Я следовал этим инструкциям, чтобы создать простой локатор сервисов, адаптированный к Kotlin и упрощенный. даже больше для целей моего вопроса:

object ServiceLocator {

    @JvmStatic
    fun getService(serviceName: String): Any {
        val service = lookupService(serviceName)

        if (service != null) {
            return service
        }

        throw UnknownServiceException()
    }

    private fun lookupService(serviceName: String): Any? {
        if (serviceName.equals("MyService")) {
            return MyService()
        }

        return null
    }
}

Я могу использовать его следующим образом:

val myService = ServiceLocator.getService("MyService") as IMyService

У меня проблема в том, что myService имеет тип Any. Я бы предпочел, чтобы вместо этого getService возвращал фактический тип. В идеале я хотел бы использовать его так:

val myService = ServiceLocator.getService<IMyService>()

Или, если это невозможно, что-то вроде этого было бы хорошо:

val myService = ServiceLocator.getService(IMyService::class)

Я не могу понять, как заставить работать параметры универсального типа. Вот что я пробовал:

@JvmStatic
fun <T> getService(): T {
    val service = lookupService<T>()

    if (service != null) {
        return service
    }

    throw UnknownServiceException()
}

private fun <T> lookupService(): T? {
    if (T::class == IMyService::class) {
        return MyService()
    }

    return null
}

Компилятор жалуется на две вещи:

  1. На T::class он жалуется: «Невозможно использовать« T »в качестве параметра овеществленного типа. Вместо этого используйте класс».
  2. На return MyService() пишет "Несоответствие типов. Требуется: T? Найдено: MyService"

Ответы:


1

Чтобы получить доступ к типу T во время выполнения без необходимости передачи класса (например, ServiceLocator.getService(IMyService::class)), вы должны использовать определенный параметр типа. Неявно это означает, что вы должны изменить свои методы на встроенные функции. Сделав это, вы можете обновить свой код до следующего:

@JvmStatic
inline fun <reified T> getService(): T {
    val service = lookupService<T>()

    if (service != null) {
        return service
    }

    throw UnknownServiceException()
}

inline fun <reified T> lookupService(): T? {
    if (T::class == IMyService::class) {
        return MyService() as T
    }

    return null
}
05.02.2019
  • Это означает, что lookupService также должен быть общедоступным. Можно ли сохранить это в тайне? 05.02.2019
  • См. обсуждение здесь . Надеюсь, это поможет. 06.02.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..