Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Generics_Inheritance - Fatal编程技术网

Java 如何通过对象传递访问另一个泛型类中的类属性?

Java 如何通过对象传递访问另一个泛型类中的类属性?,java,oop,generics,inheritance,Java,Oop,Generics,Inheritance,在我的代码中,泛型类Public将在check方法中接收泛型对象。这些泛型对象可能来自JuniorInstructor类或SeniorInstructor类。我想访问JuniorInstructor类或SeniorInstructor类的属性。我尝试了下面的实现,效果很好。但是,有没有更好的办法 class JuniorInstructor extends Instructor { public JuniorInstructor(String id, String name) {

在我的代码中,泛型类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);

    }
您可以进一步确认T:

只需确保您需要访问的所有方法都已在讲师上定义。然后你就可以在公共场合直接给他们打电话了


[Edit]@JBNizet在评论中有一个很好的观点,即如果讲师及其子类都是它需要处理的,那么Public实际上不需要是泛型。

您可以像这样声明Public类

class Public<T extends Instructor> {
      ...
   }
这样,只要您需要访问“讲师”属性,就可以避免检查实例类型

希望这有帮助

我认为可能需要使用多态性而不是泛型

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

接受juniorinstuctor的人 接受资深讲师的人 这样,就不需要使用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());
    }
}
正如沃德提到的

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

您可以按如下方式修改公共类:

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);
   }
}
然后是一个公共类:

class Public<T extends Instructor> {
T object;

public void check(T 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"));
}

我认为你使用泛型的方式是错误的。泛型的好处之一是您可以编写泛型代码,而无需使用instanceof和casting等。Senior讲师是否实现了讲师?如果是这样的话,它真的是完全通用的还是应该扩展讲师?->这可能会帮助你找到答案。你也错过了多态性的整体要点。这个类不应该是泛型的。它不应该有任何状态。它的方法应该简单地将一个讲师作为参数:class Public{Public void check讲师{System.out.printlnname:+讲师.getName+\tid:+讲师.getId;}}如果不推断子类的类型,则不需要类泛型。使类成为泛型的目的是将其用于不同的类型。@我不知道如何通过泛型实现该场景。有些人回答了,我的问题是,如果你甚至不需要在公开课上存储对初级讲师或高级讲师的引用,只需打印出他们的姓名和id,JB Nizet对你的问题的评论就更好了。谢谢。它起作用了。你把这个概念讲清楚了,谢谢。它起作用了。你让我明白这个概念。
class Public<T extends Instructor> {
T object;

public void check(T object) {
        System.out.println("name: " + object.getName() + "\tid: " + object.getId());
}
}
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"));
}