我有以下定义:

public interface MessageResponseHandler<T extends MessageBody> {
    public void responsed(Message<T> msg);
}

public class DeviceClientHelper {
    public MessageResponseHandler<? extends MessageBody> messageHandler;

    setHandler(MessageResponseHandler<? extends MessageBody> h){
        this.messageHandler = h;
    }

    public someMethod(Object message){
        Message<? extends MessageBody> msg = (Message<? extends MessageBody>) message;
        if (this.messageHandler != null) {
            this.messageHandler.responsed(msg);
        }
    }
}


我不知道为什么在someMethod()方法中调用

this.messageHandler.responsed(msg);


会使我在Eclipse中出现有线编译器错误。就像是:

the method responsed(Message<capture#3-of ? extends MessageBody>) in
the type MessageResponseHandler<capture#3-of ? extends MessageBody> is
not applicable for the arguments (Message<capture#4-of ? extends
MessageBody>)


无论如何,错误消息中的“ catpure”是什么意思?

最佳答案

您说的是DeviceClientHelper对于messageHandler的某些子类具有MessageBody。并且someMethod对于MessageBody的某些子类也有一条消息。但是,没有任何要求它们必须是MessageBody的相同子类,因此对responsed的调用无效。

要使它们使用相同的子类,请对DeviceClientHelper的特定子类使用MessageBody泛型,如下所示:

interface MessageResponseHandler<T extends MessageBody> {
    public void responsed(Message<T> msg);
}

public class DeviceClientHelper<T extends MessageBody> {
    public MessageResponseHandler<T> messageHandler;

    void setHandler(MessageResponseHandler<T> h){
        this.messageHandler = h;
    }

    public void someMethod(Object message){
        Message<T> msg = (Message<T>) message;
        if (this.messageHandler != null) {
            this.messageHandler.responsed(msg);
        }
    }
}


但是,您的MessageResponseHandler接口可能不需要关心MessageBody类。这取决于它的实际使用方式,但类似的方法可能会更好地工作:

interface MessageResponseHandler {
    public void responsed(Message<? extends MessageBody> msg);
}


然后,您可以从messageHandler字段中删除通用类型,并保留原始的someMethod实现。

09-09 17:52