嵌套具体化参数无法创建 ParameterizedTypeReference
Nested reified parameter not working to create a ParameterizedTypeReference
我有以下带有具体化参数的内联函数来泛化 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
支持功能,如回答 :
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>>() {})
}
Kotlin 似乎不支持使用具体化的参数作为泛型。
为了解决这个问题,我使用 Guava 生成了一个 Type 对象并手动构建了 ParameterizedTypeReference:
private fun <T : Any> listTypeRef(clazz: Class<T>): ParameterizedTypeReference<List<T>> {
val type = TypeToken.of(clazz).type
val make = ParameterizedTypeImpl.make(List::class.java, arrayOf(type), null)
return ParameterizedTypeReference.forType<T>(make) as ParameterizedTypeReference<List<T>>
}
然后我只是在getResources() 函数中使用它传递嵌套类型(S::class.java) 的java class:
inline fun <reified S : Any> getResources(): ResponseEntity<List<S>> {
val httpEntity = HttpEntity(null, httpHeaders)
val resourceStr = getResourceString<S>(null)
return rest.exchange(testContext.baseUrl + "/api/v1/$resourceStr", HttpMethod.GET,
httpEntity, listTypeRef(S::class.java))
}
我有以下带有具体化参数的内联函数来泛化 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
支持功能,如回答
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>>() {})
}
Kotlin 似乎不支持使用具体化的参数作为泛型。
为了解决这个问题,我使用 Guava 生成了一个 Type 对象并手动构建了 ParameterizedTypeReference:
private fun <T : Any> listTypeRef(clazz: Class<T>): ParameterizedTypeReference<List<T>> {
val type = TypeToken.of(clazz).type
val make = ParameterizedTypeImpl.make(List::class.java, arrayOf(type), null)
return ParameterizedTypeReference.forType<T>(make) as ParameterizedTypeReference<List<T>>
}
然后我只是在getResources() 函数中使用它传递嵌套类型(S::class.java) 的java class:
inline fun <reified S : Any> getResources(): ResponseEntity<List<S>> {
val httpEntity = HttpEntity(null, httpHeaders)
val resourceStr = getResourceString<S>(null)
return rest.exchange(testContext.baseUrl + "/api/v1/$resourceStr", HttpMethod.GET,
httpEntity, listTypeRef(S::class.java))
}