这实际上是工作,但声纳抱怨没有使用泛型。。我尽了最大努力来处理这个问题,但。。
问题本身:
首先,我有一个服务接口:
public interface QueueMessageReceiver<T extends QueueMessage> {
boolean onMessage(T queueMessage);
Class<T> getQueueMessageType();
}
用泛型编译nice和smooth
其次,我有几个实现该接口的服务,我添加了一个示例,还有更多(3个以上)
@Component
public class DBoxCreateMessageReceiver implements QueueMessageReceiver<DBoxCreateMessageDTO> {
@Autowired
private DatabaseService databaseService;
@Override
public boolean onMessage(DBoxCreateMessageDTO queueMessage) {
String uuid = databaseService.createMessage(queueMessage);
if (uuid == null) {
return false;
}
return true;
}
@Override
public Class<DBoxCreateMessageDTO> getQueueMessageType() {
return DBoxCreateMessageDTO.class;
}
}
当然,DBoxCreateMessageDTO扩展了队列消息
接下来,我有一个组件,它保存所有的服务实现,并根据传入的消息类型决定哪个实现必须处理当前消息
queueMessageReceivers通过Spring自动连接获取所有实现组件
但是我有一个编译错误:queueMessageReceiver.onMessage(queueMessage)
,内容为:类型队列消息接收器〈capture#3-of?〉中的方法onMessage(capture#3-of?)不适用于参数(队列消息)
@Autowired
private QueueMessageReceiver<?>[] queueMessageReceivers;
@SuppressWarnings("unchecked")
@Override
public boolean onMessage(QueueMessage queueMessage) {
for (QueueMessageReceiver<?> queueMessageReceiver : queueMessageReceivers) {
if (queueMessageReceiver.getQueueMessageType().equals(queueMessage.getClass())) {
return queueMessageReceiver.onMessage(queueMessage);
}
}
return false;
}
在这个泛型实现中调用显式实现的正确方法是什么?
如果我从类中删除所有的泛型,它工作得很好,但是声纳抱怨代码有味道...所以如果有人知道如何处理泛型,会很有帮助。
多谢了
1条答案
按热度按时间yfwxisqw1#
使用
<T extends QueueMessage>
只能保证你读取的是QueueMessage
而不是任何子类型。因此
应该是
和
应该是
在接收器中,将对象转换为所需的对象
至