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);
}