我有以下定义:
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
实现。