我有两种类型(T,M) 第一个是编译器识别的第二个不是。知道我做错了什么吗?
public class SendMessageResponse<T> {
private T result;
}
public class MessageResponse<M> {
private M message;
}
接口是这样定义的:
public interface EventQueue<T, M> {
SendMessageResponse<T> send(String address, String message, String eventId);
void consumeBatch(String address, int numOfConsumersPerQueue, Handler<MessageResponse<M>> callback);
..
}
on impl:
public class EventQueueSQS
implements EventQueue<SendMessageResultImpl, MessageImpl> {
@Override
public SendMessageResponse send(String address, String message, String eventId) {..}
@Override
public void consumeBatch(String address, int numOfConsumerThreads, Handler<MessageResponse> callback) {
}
..
}
对于consumeBatch覆盖方法我有复杂错误:
Error:(164, 17) java: name clash: consumeBatch(java.lang.String,int,io.vertx.core.Handler<java.util.List<MessageResponse>>) in EventQueueSQS and consumeBatch(java.lang.String,int,io.vertx.core.Handler<java.util.List<MessageResponse<M>>>) in EventQueue have the same erasure, yet neither overrides the other
编译器强迫我编写impl的方法:
public void consumeBatch(String address, int numOfConsumersPerQueue, Handler<MessageResponse<Message>> callback) {
为什么呢?我已经在班级宣布了它
任何想法?
也许是Iam使用Handler来保存具有泛型的类的问题?我无法找到SendMessageResponse或使用Handler&gt;之间的差异。关于泛型作为第一个起作用而另一个起作用
答案 0 :(得分:0)
当编译为字节码类型时,M
等参数被转换为绑定的实现类型(如果有界)或 Object 如果无界,请参阅this。由于您未提供任何实现类型类EventQueueSQS
的方法,接口方法和类方法都编译为Handler<MessageResponse<Object>>
,这会产生冲突错误。因此,您需要在类方法中为类型参数M提供绑定实现类型,在您的情况下为MessageImpl。
如果您不想在班级EventQueueSQS
中提供实际的实施类型,请从界面中的<M>
移除Handler<MessageResponse<M>>
,或者让您的班级也参数设置为EventQueueSQS<T,M> implements EventQueue<T,M>
你仍然必须在方法的参数中提供它,但作为参数M
,这样你就可以创建像EventQueueSQS<SendMessageResultImpl,MessageImpl>
这样的实例。
答案 1 :(得分:0)
在您的方法中,您可以设置参数类型:
Handler<MessageResponse> callback
但这与
相同Handler<MessageResponse<Object>> callback
这确实与您的类型M(MessageImpl
)冲突。如果您使用的是支持菱形运算符的Java版本,则可能允许您编写Handler<MessageResponse<>> callback
,这与编译器建议的相同。
答案 2 :(得分:0)
以下是您的具体实施:
public class EventQueueSQS
implements EventQueue<SendMessageResultImpl, MessageImpl> {
@Override
public SendMessageResponse send(String address, String message, String eventId) {..}
@Override
public void consumeBatch(
String address,
int numOfConsumerThreads,
Handler<MessageResponse> callback) {
}
..
}
根据您的界面定义,这不适合您consumeBatch
方法的签名。你需要:
public void consumeBatch(
String address,
int numOfConsumerThreads,
Handler<MessageResponse<MessageImpl>> callback) {
}