无法使用java泛型推断类型

时间:2017-12-24 10:30:32

标签: java

我有两种类型(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;之间的差异。关于泛型作为第一个起作用而另一个起作用

3 个答案:

答案 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) {
    }