Spring Integration Kotlin DSL中MessageChannels.publishSubscribe报错求解
解决Spring Integration Kotlin中MessageChannels.publishSubscribe的类型推断问题
这个问题其实是Kotlin处理Java递归泛型时的常见小坑,我来帮你快速搞定它!
首先直接给你几种可行的正确实现方式:
方式一:显式指定泛型参数
Java的MessageChannels.publishSubscribe()返回的是递归泛型PublishSubscribeChannelSpec<S extends PublishSubscribeChannelSpec<S>>,Kotlin的类型推断系统没法自动识别S的具体类型,所以我们需要显式指定它:
@Bean fun publishSubscribe(): MessageChannel { return MessageChannels.publishSubscribe<PublishSubscribeChannelSpec<*>>().get() }
这里用PublishSubscribeChannelSpec<*>作为泛型参数,告诉Kotlin我们不需要关心具体的子类型,只要符合PublishSubscribeChannelSpec的约束即可,这样就能绕过类型推断失败的问题。
方式二:直接实例化PublishSubscribeChannel
如果不需要用DSL做额外配置(比如添加拦截器、设置任务执行器等),可以直接跳过DSL,直接创建通道实例,写法更简洁:
@Bean fun publishSubscribe(): MessageChannel { return PublishSubscribeChannel() }
为什么你的尝试会报错?
- 当你指定
String作为类型参数时,错误提示“Type argument is not within its bounds”是因为S必须是PublishSubscribeChannelSpec的子类,而String完全不符合这个约束,自然会报错。 - 你尝试用
PublishSubscribeChannelSpec<String!>!时出现语法错误,是因为Kotlin不允许在类型参数中使用平台类型的感叹号(!)——这是Java到Kotlin转换时的平台类型标记,不能直接写在类型参数里。
如果之后你需要用DSL做更多配置(比如添加拦截器),显式指定泛型后就能流畅调用DSL方法了,示例如下:
@Bean fun publishSubscribe(): MessageChannel { return MessageChannels.publishSubscribe<PublishSubscribeChannelSpec<*>>() .interceptor(LoggingChannelInterceptor()) .get() }
内容的提问来源于stack exchange,提问作者Johan Vergeer
相关产品推荐
相关产品推荐

