Java中泛型类型和使用接口作为类型的区别
情景: [更新] 类别债权人可以是组织或人员类型。债权人可以是类型A、类型B或类型C。这里类型A是组织,类型B是人员。我想知道如何以最好的Java方式实现这一点Java中泛型类型和使用接口作为类型的区别,java,generics,Java,Generics,情景: [更新] 类别债权人可以是组织或人员类型。债权人可以是类型A、类型B或类型C。这里类型A是组织,类型B是人员。我想知道如何以最好的Java方式实现这一点 让两个类都实现一个接口,并让第三个类成为这些类实现的接口的实例。(将接口用作类型) 或 有一个泛型类,这样我可以实例化任何我想要的类?(使用泛型类) 哪个更受欢迎,还是完全不同 事情我错过了什么?还有解释 我有以下两个类:组织和人员 public class Org implements Entity{ private String
public class Org implements Entity{
private String name;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public Org(String name){
this.setName(name);
}
}
public class Personnel implements Entity{
private String name;
private String phoneNumber;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public void setPhoneNumber(){..}
public Personnel(String name){
this.setName(name);
}
}
上述两个类实现的接口实体“
案例1和案例2代码如下
案例1
在这里,第三类命名债权人可以是组织或人员,所以我添加了一个实体接口作为类型,以引用该类
将债权人分类为组织或个人对象
public class Creditor{
public Entity entity;
public Creditor(Entity entity){
this.entity = entity;
}
public static void main(String[] args){
Org o = new Org("Name");
Creditor c = new Creditor(o);
Personnel p = new Personnel("AJ");
Creditor c1 = new Creditor(p);
}
}
或
案例2
我不使用接口,为什么不使用泛型类型框,并根据需要实例化我想要的对象,比如
示例人员或组织
public class Creditor<T> {
private T t;
public Creditor(T t){
this.t = t;
}
public static void main(String[] args){
Org o = new Org("Name");
Personnel p = new Personnel("AJ");
Creditor<Org> c1 = new Creditor<>(o);
Creditor<Personnel> c2 = new Creditor<>(p);
}
}
公共类债权人{
私人T;
公共债权人(T){
t=t;
}
公共静态void main(字符串[]args){
组织o=新组织(“名称”);
人员p=新人员(“AJ”);
债权人c1=新债权人(o);
债权人c2=新债权人(p);
}
}
你的问题没有真正的答案。每种方式都有利弊,这取决于新的托儿所类别的用途。
例如,使用泛型方法的一个优点是,如果返回内部对象,如下所示:
Org o = c1.get();
没有铸造回真正的类型需要。
所以,试着考虑一下你的类的样子,以此来决定哪一个更适合你的需要。 < P>实际上,解决方案1中的<代码>债权人< /代码>和解决方案2中的“代码>债权人/代码>没有区别,除了<代码>债权人< /代码>是参数化的。 因此,解决方案2的优点和不便在于参数化:
- 主要优点是它允许安全铸造
- 它增加了一些形式主义,这可能是一个优势,但也不方便。例如,您将不得不对
变量的所有声明进行参数化,如果您不能这样做,将收到恼人的警告,如果大多数情况下都是这样,这将变得非常糟糕债权人
如果您不知道,我建议您从解决方案2开始,如果您意识到不便超过优势,则删除参数化。从解决方案2到解决方案1,重构将更容易。我想案例1中的代码加倍表明,这不是一个好的方法。如果您创建了两个额外的类
Cre,会发生什么ditor
可以使用?创建越来越多的构造函数?用例2并将您的类更改为公共类债权人
。向上投票是因为向下投票人没有对他/她为什么这样做发表评论。除非您告诉我们您试图用债权人
做什么,否则我们无法向您提供答案。@Tom:如果您不写,则只有重复的代码一个债权人(实体)
构造函数。@fabian已更新。如果需要更多详细信息,请查看并告诉我。@fabian如果这个问题措辞不好,我将删除它并发布一个新的问题。实际上,该代码中隐藏了一个类型转换。编译器将该代码作为Org o=(Org)(c1.get())处理
如果在调用get
之前将包含非null
值的债权人
强制转换为债权人
,您会注意到。真正的好处是编译器会检查这些类型参数。
Org o = c1.get();