【问题标题】:How to access a class's property inside another generic class by object passing?如何通过对象传递访问另一个泛型类中的类属性?
【发布时间】:2018-01-02 15:50:48
【问题描述】:

在我的代码中,通用类 Public 将在 check() 方法中接收一个通用对象。这些通用对象可能来自 JuniorInstructor 类或 SeniorInstructor 类。我想访问 JuniorInstructor 类或 SeniorInstructor 类的属性。我尝试了以下实现并且它有效。但是,有没有更好的方法来做到这一点?

   class JuniorInstructor extends Instructor {

    public JuniorInstructor(String id, String name) {
        super(id, name);

    }

}

class Public<T> {
    T object;
    JuniorInstructor j1;
    SeniorInstructor s1;

    public void check(T object) {

        this.object = object;
        if (object instanceof SeniorInstructor) {
            s1 = (SeniorInstructor) object;
            System.out.println("name: " + s1.name + "\tid: " + s1.id);
        } else {
            j1 = (JuniorInstructor) object;
            System.out.println("name: " + j1.name + "\tid: " + j1.id);
        }
    }// check
}
public static void main(String[] args) {
        SeniorInstructor s1 = new SeniorInstructor("120", "Ashik");
        JuniorInstructor j1 = new JuniorInstructor("677", "Tareq");
        Public p = new Public();

        p.check(j1);

    }

【问题讨论】:

  • 我认为您以错误的方式使用泛型。泛型的好处之一是您可以编写 generic 代码,而无需使用 instanceof 和强制转换等...
  • SeniorInstructor 是否实现 Instructor?如果是这样,T 真的打算完全通用还是应该扩展 Instructor? --> 这可能会帮助你找到答案。
  • 你也错过了多态性的全部意义。该类不应该是通用的。它不应该有任何状态。它的方法应该简单地将 Instructor 作为参数:class Public { public void check(Instructor instructor) { System.out.println("name: " + instructor.getName() + "\tid: " + instructor.getId()); } }
  • 如果你不推断子类的类型,你就不需要类泛型。使类泛型的意义在于将其与不同的类型一起使用。
  • @Ward 我不知道如何通过泛型实现场景。有人回答,我的问题就解决了

标签: java oop generics inheritance


【解决方案1】:

您可以进一步限定T

class Public<T extends Instructor>

只需确保您需要访问的所有方法都在Instructor 上定义。然后您就可以直接通过Public 联系他们。

[编辑] @JBNizet 在 cmets 中有一个很好的观点,如果 Instructor 及其子类只需要处理,Public 就不需要是泛型。

【讨论】:

  • 谢谢。有用。你让我明白了这个概念。
【解决方案2】:

你可以像这样声明公共类

class Public<T extends Instructor> {
      ...
   }

这样你就可以避免检查实例类型,只要你需要访问'Instructor'属性。

希望有帮助

【讨论】:

  • 谢谢。有用。你让我明白了这个概念。
【解决方案3】:

我认为可能想要使用 polymorphism 而不是 generics

创建check方法的2个重载版本:

  • 接受JuniorInstructor
  • 接受SeniorInstructor

通过这种方式,不需要使用instanceOf 或将对象转换为给定类型。

class Public {
    JuniorInstructor j1;
    SeniorInstructor s1;

    public void check(SeniorInstructor object) {
        s1 = object;
        System.out.println("name: " + s1.getName() + "\tid: " + s1.getId());
    }

    public void check(JuniorInstructor object) {
        j1 = object;
        System.out.println("name: " + j1.getName() + "\tid: " + j1.getId());
    }
}

【讨论】:

  • 或者,如果您甚至不需要在 Public 类中存储对 JuniorInstructorSeniorInstructor 的引用,只需打印出它们的 nameid,评论JB Nizet 在你的问题上做得更好。
【解决方案4】:

正如沃德所说,

泛型的好处之一是您可以编写泛型代码,而无需使用 instanceof 和强制转换等...

您可以修改公共类如下:

class Public<T extends Instructor> {
   T instructor;

   public void check(T object) {
       this.instructor = object;
       System.out.println("name: " + this.instructor.name + "\tid: " + this.instructor.id);
   }
}

【讨论】:

    【解决方案5】:
    public class Instructor {
    
    private String id;
    private String name;
    
    public Instructor(String id, String name) {
            this.id= id; this.name= name;
    }
    
    //getters and setters
     }
    

    然后是公开课:

    class Public<T extends Instructor> {
    T object;
    
    public void check(T object) {
            System.out.println("name: " + object.getName() + "\tid: " + object.getId());
    }
    }
    

    但是,如果您的类只有 1 个使用此 T 作为参数的方法,您可以将其修改为:

    class Public {
    
    public <T extends Instructor> void check(T object) {
            System.out.println("name: " + object.getName() + "\tid: " + object.getId());
    }
     }
    

    或者由于这里泛型的用法不清楚,我们可以简单地使用:

    class Public {
    
    public  void check(Instructor object) {
            System.out.println("name: " + object.getName() + "\tid: " + object.getId());
    }
     }
    

    主要是:

     public static void main(String[] args) {
        Public obj= new Public();
        obj.check(new JuniorInstructor("1","Payal"));
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2015-04-04
      • 1970-01-01
      • 2022-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多