所以我有这段代码:
public PacketListener packetListener;
@Override
protected void channelRead0(ChannelHandlerContext ctx, Packet<?> packet) throws Exception
{
if (this.channel.isOpen()) {
try {
packet.handle(this.packetListener);
}
catch (Exception ex) {
;
}
}
}
在packet.handle(this.packetListener);
上出现错误:The method handle(capture#1-of ?) in the type Packet<capture#1-of ?> is not applicable for the arguments (PacketListener)
。这有什么问题?我的意思是我知道吗? type是未知的,通常不允许使用任何类型的参数(或者至少我已经读过),但是在代码中,type参数扩展了PacketListener
,所以我看不到错误。
Packet类如下:
public interface Packet<T extends PacketListener>
{
void encode(PacketDataSerializer packetdataserializer) throws IOException;
void decode(PacketDataSerializer packetdataserializer) throws IOException;
void handle (T listener);
}
在做任何事情之前,不,它与Minecraft Server不相关,是的,我帮助自己进行了Minecraft Server源代码(来自bukkit / spigot服务器的源代码)的命名和结构工作。
编辑:
好的评论让我开始思考,所以我测试了一些内容,这不是通配符,因此不起作用...
private static <T extends PacketListener> void a(Packet<T> packet, PacketListener packetlistener) {
packet.handle(packetlistener);
}
答案 0 :(得分:2)
让我们看一下这段代码:
private static <T extends PacketListener> void a(Packet<T> packet,
PacketListener packetlistener) {
packet.handle(packetlistener);
}
这将在类型为handle
的{{1}}对象上调用packet
方法。该方法的签名在Packet<T>
界面中定义为:
Packet
因此它接受类型为 void handle (T listener);
的参数。但是您正在使用参数T
调用它,该参数的类型为packetlistener
。也就是说,参数的类型不是PacketListener
,因为通常T
可以是T
的某些子类型,但是您只提供了基本类型PacketListener
。
最简单的解决方法是要求PacketListener
对象的类型为packetlistener
,以便T
方法可以接受它:
handle