我正在尝试实现用于处理外部API调用的基本功能:
inline fun <reified T> get(url: String): T? {
try {
val restTemplate = RestTemplate()
val response = restTemplate.exchange<Any>(
url,
HttpMethod.GET,
headersForRestTemplate,
T::class)
return response.getBody() as T
} catch (e: Exception) {
log.info("Exception ::" + e.message)
throw ServiceException(e)
}
}
我所说的方式非常简单:
api.get<SWObject>(Utils.SW_API)
尝试执行该代码时,出现强制转换异常:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to jp.co.xx.demo.models.SWObject
返回的对象不是
SWObject
类的实例,而是LinkedHashMap
。我仍在努力使用reified
或inline
关键字,如果我的实现未遵循最佳做法,则感到抱歉。
最佳答案
在T::class.java
方法中使用T::class
代替exchange
,并从Any
方法调用中删除显式类型参数exchange
,因为它不必要。您也不需要将响应主体强制转换为T
。
inline fun <reified T> get(url: String): T? {
try {
val restTemplate = RestTemplate()
val response = restTemplate.exchange(
url,
HttpMethod.GET,
headersForRestTemplate,
T::class.java
)
return response.getBody()
} catch (e: Exception) {
log.info("Exception ::" + e.message)
throw ServiceException(e)
}
}
Object::class
返回Kotlin类(KClass
),而Object::class.java
返回Java类(Class
),等效于Java的Object.class
。请注意,KClass
与Class
不同。exchange
方法只是希望其responseType
参数是Class
(或ParametrizedTypeReference
,但事实并非如此)的类型。
关于spring-boot - Kotlin的一般性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155842/