java.lang.ClassCastException:无法将类 java.util.LinkedHashMap 转换为

问题描述 投票:0回答:1
data class Response<T>(
    val result: T
)

class MyResult : HashMap<String, Any?>() {
    // custom methods
}

fun<T> getDocument(
    uri: String
): Response<T> =
    webClient.get()
        .uri(uri).retrieve()
        .bodyToMono(object : ParameterizedTypeReference<Response<T>>() {})
        .block()

当我调用它时

getDocument<MyResult>("uri")
它会抛出以下内容:
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class com.test.model.MyResult (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.test.model.MyResult is in unnamed module of loader 'app')

但是,如果我通过显式指定类型将 getDocument 的返回类型更改为

Response<MyResult>
,它就可以正常工作。这样:

fun getDocument(
    uri: String
): Response<MyResult> =
    webClient.get()
        .uri(uri).retrieve()
        .bodyToMono(object : ParameterizedTypeReference<Response<MyResult>>() {})
        .block()

现在调用

getDocument("uri")
工作正常。

这是为什么呢?我该如何解决它?

java kotlin spring-webclient
1个回答
0
投票

该问题是由于编译时类型擦除造成的,有关类型的信息丢失了:https://docs.oracle.com/javase/tutorial/java/generics/nonReABLEVarargsType.html#non-reABLE-types

通过具体化泛型给出解决方案:

final inline fun<reified T> getDocument(
    uri: String
): Response<T> =
    webClient.get()
        .uri(uri).retrieve()
        .bodyToMono(object : ParameterizedTypeReference<Response<T>>() {})
        .block()
© www.soinside.com 2019 - 2024. All rights reserved.