gpt4 book ai didi

java - 类型参数 T 扩展类不允许类在方法中用作 T 参数

转载 作者:行者123 更新时间:2023-12-02 07:48:58 25 4
gpt4 key购买 nike

所以我有这段代码:

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) 。这有什么问题吗?我的意思是我知道?类型是未知的,它通常不允许任何类型的参数(或者至少我读过),但在代码中类型参数扩展了 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);
}

最佳答案

让我们看一下这段代码:

private static <T extends PacketListener> void a(Packet<T> packet,
PacketListener packetlistener) {
packet.handle(packetlistener);
}

这称为 handle packet上的方法对象,其类型为 Packet<T> 。该方法的签名定义在Packet中界面为:

    void handle (T listener);

因此它接受 T 类型的参数。但你用参数 packetlistener 来调用它,其类型为 PacketListener 。也就是说,参数的类型不是 T ,因为一般来说T可以是 PacketListener 的某些子类型,但您只提供了基本类型 PacketListener .

最简单的解决方法是需要 packetlistener对象具有类型 T ,因此可以被 handle 接受方法:

private static <T extends PacketListener> void a(Packet<T> packet,
/* changed here -> */ T packetlistener) {
packet.handle(packetlistener);
}

关于java - 类型参数 T 扩展类不允许类在方法中用作 T 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59012659/

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