Java 如何通过对象传递访问另一个泛型类中的类属性?
在我的代码中,泛型类Public将在check方法中接收泛型对象。这些泛型对象可能来自JuniorInstructor类或SeniorInstructor类。我想访问JuniorInstructor类或SeniorInstructor类的属性。我尝试了下面的实现,效果很好。但是,有没有更好的办法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) {
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"));
}