gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 16:20:06 24 4
gpt4 key购买 nike

我有以下定义:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com