我有以下定义:
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
有一个 MessageBody
的某些子类的 messageHandler
。并且 someMethod
也为 MessageBody
的某些子类提供消息。但是,没有任何要求它们是 MessageBody
的相同子类,因此对 responsed
的调用无效。
要使它们使用相同的子类,请在 MessageBody
的特定子类上使 DeviceClientHelper
通用,如下所示:
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
接口(interface)可能不需要关心 MessageBody
类。这取决于它的实际使用方式,但像这样的东西可能会更好:
interface MessageResponseHandler {
public void responsed(Message<? extends MessageBody> msg);
}
然后您可以从 messageHandler
字段中删除泛型类型并保留原始 someMethod
实现。
关于Java泛型 "capture#n-of"编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826646/