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")
工作正常。
这是为什么呢?我该如何解决它?
该问题是由于编译时类型擦除造成的,有关类型的信息丢失了: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()