Я следовал этим инструкциям, чтобы создать простой локатор сервисов, адаптированный к 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 »в качестве параметра овеществленного типа. Вместо этого используйте класс». - На
return MyService()
пишет "Несоответствие типов. Требуется: T? Найдено: MyService"
lookupService
также должен быть общедоступным. Можно ли сохранить это в тайне? 05.02.2019