gpt4 book ai didi

spring-boot - Kotlin的一般性问题

转载 作者:行者123 更新时间:2023-12-02 13:36:01 25 4
gpt4 key购买 nike

我正在尝试实现用于处理外部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。我仍在努力使用 reifiedinline关键字,如果我的实现未遵循最佳做法,则感到抱歉。

最佳答案

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。请注意, KClassClass不同。
exchange方法只是希望其 responseType参数是 Class(或 ParametrizedTypeReference,但事实并非如此)的类型。

关于spring-boot - Kotlin的一般性问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57155842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com