【发布时间】:2018-10-22 08:25:15
【问题描述】:
我有以下内联函数和一个具体化的参数来概括一个 http 资源获取:
inline fun <reified N> getResources(): ResponseEntity<List<N>> {
val httpEntity = HttpEntity(null, httpHeaders)
val resourceStr = getResourceString<N>()
return rest.exchange(testContext.baseUrl + "/api/v1/$resourceStr", HttpMethod.GET,
httpEntity, typeRef<List<N>>())
}
我正在构建 ParameterizedTypeReference 和 typeRef 支持功能,如回答 here:
inline fun <reified T : Any> typeRef(): ParameterizedTypeReference<T>{
return object : ParameterizedTypeReference<T>() {}
}
当调用getResources<Employee>()时,构建的ParameterizedTypeReference有ParameterizedTypeReference.type.actualTypeArguments包含java.util.List<? extends N>而不是java.util.List<Employee>。
请注意,我将 typeRef<List<N>>(其中 N 已具体化)从 getResources() 传递到 typeRef() 预期的具体化类型 T,但它似乎无法正确构建其类型。
为什么这不起作用?有什么解决办法吗?
更新:
我已将代码重构为在第一个内联函数中直接构建 ParameterizedTypeReference,但我仍将其作为 java.util.List<? extends N>。
private inline fun <reified N> getResources(): ResponseEntity<List<N>> {
val httpEntity = HttpEntity(null, httpHeaders)
val resourceStr = getResourceString<N>()
return rest.exchange(testContext.baseUrl + "/api/v1/$resourceStr", HttpMethod.GET,
httpEntity, object : ParameterizedTypeReference<List<N>>() {})
}
【问题讨论】:
标签: spring generics kotlin kotlin-reified-type-parameters