具有泛型类型的Java工厂

具有泛型类型的Java工厂,java,generics,Java,Generics,我正在为我的大学做一个项目,我遇到了一个问题 基本上,该项目由一个客户机-服务器应用程序组成,我想为通信创建一个数据包类。数据包由头和正文组成。现在问题来了。我可以有一些不同类型的主体,但它们都继承了泛型类主体 我的想法是创建一个包类,如下所示: public class Packet <T extends Body>{ private Header header; private T body; } 现在我想要一种工厂,当我从服务器的main调用方法factory

我正在为我的大学做一个项目,我遇到了一个问题

基本上,该项目由一个客户机-服务器应用程序组成,我想为通信创建一个数据包类。数据包由头和正文组成。现在问题来了。我可以有一些不同类型的主体,但它们都继承了泛型类主体

我的想法是创建一个包类,如下所示:

public class Packet <T extends Body>{
    private Header header;
    private T body;
}
现在我想要一种工厂,当我从服务器的main调用方法factory.createPacket()时,它以这种方式构建数据包:

  • 从SocketChannel读取标题
  • 根据标题的字段,它将读取该类型的正文
  • 例如,如果它读取头上的CREATE(一种OPS)操作,它应该读取CreateBody(继承主体)

    此外,每个实体都必须有一个函数,该函数允许从SocketChannel获取该类型的实体,这就是我想使用泛型的原因

    有人能告诉我更好的方法吗


    谢谢大家!

    不确定您是否真的想在这里使用泛型。这只会在你全力以赴的情况下对你有所帮助。如果你走这条路,你的最终目标应该是依靠编译器来检测当你把一些
    标题
    与错误类型的
    正文
    混合在一起时。这意味着
    标题也应该参数化

    您的
    标题
    最终决定了
    正文
    类型。由于它嵌入了这一知识,因此最好是使该信息可供类型系统使用,即
    标题

    要使其正常工作,您需要根据
    OPS
    实例,从标题中找出此类型
    T
    。因此,
    OPS
    本身需要是一个参数化类型

    如果
    OPS
    enum
    ,则无法对其进行参数化,因此无法以类型安全的方式进行参数化(即,在某个点没有显式强制转换);因此,您必须添加如下方法:

    Class<? extends Body> bodyType();
    
    确保其安全的唯一方法是将
    OPS
    自身参数化为
    OPS
    ,并手动实例化每个OPS类型(因为枚举不支持此操作)


    如果这看起来很麻烦,那是故意的。这主要是为了阻止你使用泛型,因为我猜你在这里真的不需要它们。要验证这一点,请在声明为
    Packet
    的代码中查找任何引用,如果该引用仅仅是
    Packet
    ,则无法使用


    假设您可以将任何
    Body
    子类型视为顶级
    Body
    抽象,
    OPS
    可以绑定到特定的
    Body
    子类(内部),如上所述:
    类您可以发布来自客户端和服务器的两个示例用法吗?你认为
    公共类包{private Header;private T body;}
    在哪方面可以帮助你而不是
    公共类包{private Header;private body;}
    ?我真的不确定你说了什么(我是Java新手),但问题是我想创建一个函数,比如getFromSocket,它从套接字初始化对象。在不使用泛型的情况下,我必须为每个扩展body的类编写相同的代码,唯一的区别是将传入的数据包转换为该类的类型。
    Class<? extends Body> bodyType();
    
    class Header<T extends Body> {
        private final Class<T> bodyType;
        public Header(OPS ops) {
            // any type-safety feeling gets blown here!
            this.bodyType = (Class<T>) ops.bodyType();
        }
        // ...
    }