Java中使用Generic Type和Using Interface作为类型的区别

时间:2015-05-17 11:31:10

标签: java generics

情景:

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

  1. 让两个类都实现一个接口,让第三个类成为这些类实现的接口的实例。 (使用Interface作为类型)
  2. OR

    1. 有一个泛型类,以便我可以实例化我想要的任何类? (使用通用类)
    2. 哪个更优选或者它们完全不同 东西?我错过了什么?也解释。

      我有以下两个类Org和Personnel。

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

      上述类实现"

      的接口实体
      interface Entity{
        String getName();
      }
      

      案例1和案例2代码如下。

      案例1。

      这里,名为Creditor的第三个类可以是一个Org或Personnel,所以我添加了一个Entity接口作为类型,来引用这个 类债权人或组织对象。

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

      OR

      案例2.

      不是使用Interface,为什么我不使用泛型类型框并根据需要实例化我想要的对象,例如 示例人员或组织。

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

2 个答案:

答案 0 :(得分:1)

你的问题没有真正的答案。在每种方式都有利弊,取决于新Crediator类的用法。 例如,一个使用泛型方法的专家是,如果你返回内部对象,就像这样:

Org o = c1.get();

不能回归到所需的真实类型。 所以,试着考虑一下你的课程是什么样子,然后根据你的需要来决定哪个更合适。

答案 1 :(得分:1)

实际上,解决方案1中的Creditor与解决方案2中的Creditor<T extends Entity>之间没有区别,除了参数化Creditor<T extends Entity>这一事实。

因此,解决方案2的优点和不便之处在于参数化:

  • 主要优点是可以安全铸造
  • 它增加了一些形式主义,这可能是一个优势,但也是一个不方便。例如,你必须参数Creditor变量的所有声明参数,并且如果你不能这样做会发出恼人的警告,如果在大多数情况下这种情况就会变得非常难看。

如果您不知道,我建议您从解决方案2开始,如果您发现不方便的优点,请删除参数化。从解决方案2到解决方案1,重构将更容易。