我在KotlinSpring Boot上有2个具有请求/响应模式的服务。
在producer中,我尝试对send方法使用泛型,以避免编写具有不同返回类型的多个方法:
fun <T> sendMessage(data: String) : T {
val listenableFuture = asyncRabbitTemplate.convertSendAndReceiveAsType(
directExchange.name,
"routing-key",
data,
object : ParameterizedTypeReference<T>() {}
)
return listenableFuture.get()
}
例如,我将此方法用于其中一个Model类:
制作人:
fun getData(): ExampleDto {
...
return rabbitTemplate.sendMessage<ExampleDto>("data")
}
消费者:
...
@RabbitListener(...)
fun consumer(data: String): ExampleDto {
...
// processing with data
return ExampleDto(...)
}
所以我得到异常class java.util.LinkedHashMap cannot be cast to class com.example.model.ExampleDto (java.util.LinkedHashMap is in module java.base of loader 'bootstrap'; com.example.model.ExampleDto is in unnamed module of loader 'app')
如果我写的方法不带泛型,直接声明返回类型,那么一切都很好,但是我不想写很多只在返回类型上不同的方法。
1条答案
按热度按时间9rbhqvlz1#
ParameterizedTypeReference
似乎是用来实作Super Type Token模式。当您将T
当做参数型别传递时,convertSendAndReceiveAsType
中的基础逻辑会因为泛型type erasure而无法推断出确切的型别。你要么需要用
ParameterizedTypeReference
参数化你的sendMessage
方法,然后用getData()
中的具体类型创建它,要么你可以使用物化类型参数Kotlin特性来克服这个问题。