Java 抽象泛型对象类

Java 抽象泛型对象类,java,class,Java,Class,你好 在游戏Minecraft中,您必须在客户端和服务器之间发送数据以同步内容,在特定情况下需要同步的内容之一是带有渲染的TileEntities。数据存储在服务器上并发送到客户端,然后客户端用于渲染 创建一个包含需要同步的数据的类,并将其附加到名为“”的通道创建API。我的网络对象和消息对象: public class intergraftpackethandler { 私有静态int索引=1; 私有静态最终ResourceLocation通道_NAME=新ResourceLocation(R

你好

在游戏Minecraft中,您必须在客户端和服务器之间发送数据以同步内容,在特定情况下需要同步的内容之一是带有渲染的
TileEntities
。数据存储在服务器上并发送到客户端,然后客户端用于渲染

创建一个包含需要同步的数据的类,并将其附加到名为“”的通道创建API。我的网络对象和消息对象:

public class intergraftpackethandler
{
私有静态int索引=1;
私有静态最终ResourceLocation通道_NAME=新ResourceLocation(Reference.MODID,“网络”);
private static final String PROTOCOL_VERSION=new ResourceLocation(Reference.MODID,“1”).toString();
公共静态SimpleChannel getNetworkChannel()
{
最终SimpleChannel=NetworkRegistry.ChannelBuilder.named(通道名称)
.clientAcceptedVersions(版本->真)
.serverAcceptedVersions(版本->真)
.networkProtocolVersion(()->协议_版本)
.simpleChannel();
//同步功能标识隐藏数据消息。
channel.messageBuilder(MessageIdentityHidden.class,索引)
.encoder(MessageIdentityHidden::encode)
.decoder(MessageIdentityHidden::decode)
.consumer(MessageIdentityHidden::handle)
.add();索引++;
//将树可选实体数据发送到客户端。
messageBuilder(MessageTreeTap.class,索引)
.encoder(MessageTreeTap::encode)
.decoder(MessageTreeTap::decode)
.consumer(MessageTreeTap::handle)
.add();索引++;
//将ChunkLoaderLifeEntity数据发送到客户端。
channel.messageBuilder(MessageChunkLoader.class,索引)
.encoder(MessageChunkLoader::encode)
.decoder(MessageChunkLoader::decode)
.consumer(MessageChunkLoader::handle)
.add();索引++;
返回通道;
}
}
public类MessageChunkLoader
{
私人BlockPos;
私有布尔加载;
public MessageChunkLoader(BlockPos pos、boolean canLoad)
{
this.pos=pos;
this.canLoad=canLoad;
}
公共无效手柄(供应商ctx)
{
ctx.get().enqueueWork(()->{
试一试{
ChunkLoaderBaseTileEntity磁贴=(ChunkLoaderBaseTileEntity)Minecraft.getInstance().world.getTileEntity(pos);
tile.canLoad=canLoad;
}捕获(NullPointerException错误){
System.out.println(String.format(“在%s%s%s!处找不到ChunkLoaderLifeEntity!”,pos.getX(),pos.getY(),pos.getZ());
}
});
}
公共静态无效编码(MessageChunkLoader消息、PacketBuffer缓冲区)
{
buffer.writeBlockPos(message.pos);
buffer.writebolean(message.canLoad);
}
公共静态MessageChunkLoader解码(最终打包缓冲区)
{
返回新的MessageChunkLoader(buffer.readBlockPos(),buffer.readBoolean());
}
}
然后在mod项目中的对象使用的主mod类中初始化它

@Mod(Reference.MODID)
公共类间作核心
{
public static final SimpleChannel NETWORK=IntercraftPacketHandler.getNetworkChannel();
...
问题和这篇文章的问题;现在我根据
MessageChunkLoader
中的公式创建了一个新的message类(公共静态编码和解码方法和句柄方法)。我想创建一个更通用的类,用于为
TileEntities
创建消息类,但我在这方面遇到了问题。以下是当前的类:

公共抽象类MessageTileEntity
{
受保护的最终BlockPos;
受保护的最终类clazz;
公共消息权限(BlockPos、类别类别)
{
this.pos=pos;
this.clazz=clazz;
}
公开摘要无效句柄(供应商ctx);
受保护的T getTileEntity()
{
试一试{
返回clazz.cast(Minecraft.getInstance().world.getTileEntity(pos));
}捕获(NullPointerException e){
System.out.println(String.format(“在[%d%d%d]处找不到%s!”,clazz.getSimpleName(),pos.getX(),pos.getY(),pos.getZ());
投掷e;
}catch(ClassCastException e){
System.out.println(String.format(“位于[%d%d%d]的TileEntity不是%s!”,pos.getX(),pos.getY(),pos.getZ(),clazz.getSimpleName());
投掷e;
}
}
公共静态无效编码(MessageTileEntity消息、PacketBuffer缓冲区)
{
}
公共静态消息最终解码(最终包缓冲区)
{
返回null;
}
}

主要问题是我缺乏适当的Java技能,无法让它像我希望的那样正常工作。方法
handle
很简单,因为它是非静态的,需要对每个
直到属性
消息进行自定义,但是需要是静态的方法
encode
decode
给我带来了问题。我不知道我在尝试什么实现是可能的,询问不会有什么坏处。也许解决方案比我想象的要简单。

你不能在静态方法中使用类级别的泛型。但是,你可以通过方法级别传入泛型来实现你想要的。更多信息:你是指这样的事情吗?
public static void encode(T message,PacketBuffer)
它允许我取回对象,但我不能覆盖它,也不能对数据进行编码/解码。