Java 类型参数T扩展类不';t允许类用作方法中的t参数

Java 类型参数T扩展类不';t允许类用作方法中的t参数,java,netty,Java,Netty,我有一段代码: public PacketListener packetListener; @Override protected void channelRead0(ChannelHandlerContext ctx, Packet<?> packet) throws Exception { if (this.channel.isOpen()) { try { packet.handle(this.packetListener);

我有一段代码:

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) {
            ;
        }
    }
}
在做出任何假设之前,不,它与Minecraft服务器无关,是的,我从Minecraft服务器源代码(bukkit/Spigt服务器的源代码)中帮助自己命名和结构

编辑:

好吧,一条评论让我思考,所以我测试了一些东西,它不是通配符,也不起作用

private static <T extends PacketListener> void a(Packet<T> packet, PacketListener packetlistener) {
    packet.handle(packetlistener);
}
私有静态无效a(数据包、数据包侦听器、数据包侦听器){
句柄(packetlistener);
}

让我们看看这段代码:

专用静态无效a(数据包、,
PacketListener(PacketListener){
句柄(packetlistener);
}
这将调用
packet
对象上的
handle
方法,该对象的类型为
packet
。此方法的签名在
数据包
接口中定义为:

void句柄(T侦听器);
因此,它接受类型为
T
的参数。但是您使用参数
packetlistener
调用它,该参数的类型为
packetlistener
。也就是说,参数的类型不是
T
,因为通常
T
可以是
PacketListener
的某些子类型,但您只提供了基本类型
PacketListener

最简单的修复方法是要求
packetlistener
对象的类型为
T
,这样它就可以被
句柄
方法接受:

专用静态无效a(数据包、,
/*此处更改->*/T packetlistener){
句柄(packetlistener);
}

试试
软件包它很管用,但为什么我不能离开?单独地我的意思是,它确实扩展了PacketListener……短版本与协变、逆变以及java(
)中的通配符类型是协变的这一事实有关。您可以将
分配给上限,但不能将上限分配给
,但一般来说,您无法将类级别的泛型参数传递给通配符类型。@Rogue我用不同的解决方案尝试编辑了我的问题。嗯,本质上是同一个问题
T extends PacketListener
是一个协变界,您需要一个逆变界。或者只是一个非变量的
数据包
,我还可以提醒您,您可以将
PacketListener
的子类传递给一个方法参数,该参数就是
PacketListener
(无泛型)。Welp。Minecraft服务器工作异常,无论如何,我一般都删除了类型参数,因为我从来没有真正想要它们,所以我只添加了
void句柄(T listener)
private static <T extends PacketListener> void a(Packet<T> packet, PacketListener packetlistener) {
    packet.handle(packetlistener);
}