具有泛型类型的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()时,它以这种方式构建数据包:
谢谢大家! 不确定您是否真的想在这里使用泛型。这只会在你全力以赴的情况下对你有所帮助。如果你走这条路,你的最终目标应该是依靠编译器来检测当你把一些
标题
与错误类型的正文
混合在一起时。这意味着标题也应该参数化
您的标题
最终决定了正文
类型。由于它嵌入了这一知识,因此最好是使该信息可供类型系统使用,即标题
要使其正常工作,您需要根据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();
}
// ...
}