类型参数 T extends class 不允许 class 在方法中用作 T 参数
Type argument T extends class doesn't allow class to be used as T parameter in method
所以我有这段代码:
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 是未知的,它通常不允许任何类型的参数(或者至少我已经读过),但是在代码中类型参数扩展 PacketListener
所以我没有看到错误。
数据包 class 看起来像这样:
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);
}
这会调用类型为 Packet<T>
的 packet
对象的 handle
方法。此方法的签名在 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);
}
所以我有这段代码:
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 是未知的,它通常不允许任何类型的参数(或者至少我已经读过),但是在代码中类型参数扩展 PacketListener
所以我没有看到错误。
数据包 class 看起来像这样:
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);
}
这会调用类型为 Packet<T>
的 packet
对象的 handle
方法。此方法的签名在 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);
}