【发布时间】:2019-02-05 17:27:08
【问题描述】:
我正在尝试基于this article 在 Kotlin 中实现一个简单的服务定位器,但我想使用泛型类型参数。我还试图避免使用具体类型参数内联函数,因为这要求所有内容都是公开的。
这个类负责缓存定位服务的实例:
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 的实例,它每次都返回null。问题出在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”。我如何在没有内联的情况下完成这项工作,这需要公开服务列表?
【问题讨论】:
标签: design-patterns kotlin inversion-of-control service-locator