Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中泛型类型和使用接口作为类型的区别_Java_Generics - Fatal编程技术网

Java中泛型类型和使用接口作为类型的区别

Java中泛型类型和使用接口作为类型的区别,java,generics,Java,Generics,情景: [更新] 类别债权人可以是组织或人员类型。债权人可以是类型A、类型B或类型C。这里类型A是组织,类型B是人员。我想知道如何以最好的Java方式实现这一点 让两个类都实现一个接口,并让第三个类成为这些类实现的接口的实例。(将接口用作类型) 或 有一个泛型类,这样我可以实例化任何我想要的类?(使用泛型类) 哪个更受欢迎,还是完全不同 事情我错过了什么?还有解释 我有以下两个类:组织和人员 public class Org implements Entity{ private String

情景:

[更新] 类别债权人可以是组织或人员类型。债权人可以是类型A、类型B或类型C。这里类型A是组织,类型B是人员。我想知道如何以最好的Java方式实现这一点

  • 让两个类都实现一个接口,并让第三个类成为这些类实现的接口的实例。(将接口用作类型)
  • 有一个泛型类,这样我可以实例化任何我想要的类?(使用泛型类)
  • 哪个更受欢迎,还是完全不同 事情我错过了什么?还有解释

    我有以下两个类:组织和人员

    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();