类型参数T扩展了类,不允许将类用作方法中的T参数

问题描述 投票:2回答:1

所以我有这段代码:

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);
}
java netty
1个回答
0
投票

让我们看一下这段代码:

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.