Java泛型 "capture#n-of"编译错误

标签 java eclipse generics

我有以下定义:

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/

相关文章:

java - 可以将 List<Class> 上传到 firebase 实时数据库

javascript - 如何为日期选择器创建外部 javascript 和外部 css 文件以及如何在 Eclipse 中使用它

java - 如何清除 Eclipse 中的搜索结果?

c# - 使用对象而不是泛型

java - 如何理解泛型方法中选择了什么类型而不是T?

java - LocalDateTime 将无效日期解析为有效日期并且不抛出任何异常

java - 泛型方法调用

java - 在 Java 中定义公共(public)库接口(interface)

java - 在 Windows 上使用 Eclipse/Subversive 重命名 Java 文件的最佳实践

java - 我可以做这个通用的事情吗?