Kotlin:基于函数返回值的未检查类型推断及Java代码转译问题
解决Kotlin中泛型服务获取的未检查类型推断问题
嘿,我来帮你把Java里那个优雅的泛型服务获取方法转成Kotlin,同时搞定未检查类型转换的问题!
首先先回顾下你Java里的实现:通过泛型方法<T> T getService,利用返回类型推断来避免类型转换警告,本质是把Spring上下文获取的Bean强制转成泛型类型T,因为调用时明确了返回类型,所以编译器不会报警告。
在Kotlin里,我们可以用几乎一致的逻辑实现,不过需要处理Kotlin的未检查转换提示,具体代码如下:
// 抑制未检查类型转换的警告,因为我们确认Bean类型和目标泛型T匹配 @Suppress("UNCHECKED_CAST") fun <T> getService(name: String): T { return appCtx.getBean(name) as T }
使用示例
和Java的用法保持一致,你可以写包装方法来固定返回类型:
fun getStatusService(): StatusService = getService("statusService") fun getVenueService(): VenueService = getService("venueService")
甚至可以更简洁,直接在调用时指定泛型类型,不用写包装方法:
// 利用Kotlin的类型推断,不用显式指定泛型 val statusService: StatusService = getService("statusService") // 或者显式指定泛型类型 val venueService = getService<VenueService>("venueService")
为什么这么做是安全的?
Kotlin会对未检查的类型转换发出警告,这里我们用@Suppress("UNCHECKED_CAST")告诉编译器:我们清楚这个转换是安全的,因为Spring上下文里的name对应的Bean类型就是我们要的泛型T,就像Java里的逻辑一样,不会有类型安全问题。
内容的提问来源于stack exchange,提问作者gil.fernandes
相关产品推荐
相关产品推荐

