Я следовал этим инструкциям , чтобы создать простой сервисный локатор, адаптированный к 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
}
Компилятор жалуется на две вещи:
- На
T::class
, он жалуется "Невозможно использовать 'T' в качестве параметра типа reified.Вместо этого используйте класс. " - На
return MyService()
написано" Несоответствие типов. Обязательно: T? Найдено: MyService "