如何在泛型类中通过对象传递访问其他类属性?现有实现优化咨询
问题描述
我在泛型类Public的check()方法中接收一个泛型对象,这个对象可能是JuniorInstructor或SeniorInstructor类的实例(两者都继承自Instructor)。目前我通过instanceof判断类型然后强制转换来访问name和id属性,代码能正常运行,但想知道有没有更优的实现方式。
当前实现代码:
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); }
优化方案
嘿,我来给你几个更优雅的优化思路,完全符合面向对象的设计原则,还能让代码更简洁易维护:
1. 利用父类共性,直接消除类型判断
既然JuniorInstructor和SeniorInstructor都继承自Instructor,那name和id肯定是父类Instructor的属性吧?那我们根本不需要判断具体子类类型,直接通过父类类型访问这些共享属性即可。同时给泛型加上边界限定,保证类型安全:
// 限定泛型必须是Instructor的子类 class Public<T extends Instructor> { public void check(T object) { // 直接通过父类引用访问共享属性,无需类型转换 System.out.println("name: " + object.name + "\tid: " + object.id); } } // main方法中使用带泛型参数的实例,避免原始类型 public static void main(String[] args) { SeniorInstructor s1 = new SeniorInstructor("120", "Ashik"); JuniorInstructor j1 = new JuniorInstructor("677", "Tareq"); Public<Instructor> p = new Public<>(); p.check(j1); p.check(s1); }
2. 用多态方法处理子类差异化逻辑
如果后续子类需要添加独特的属性或打印逻辑,不要用instanceof做分支判断,而是在父类定义抽象方法,让子类各自实现自己的版本。这样调用时会自动适配子类的实现,完全消除类型判断:
首先改造父类Instructor:
abstract class Instructor { protected String id; protected String name; public Instructor(String id, String name) { this.id = id; this.name = name; } // 定义抽象方法,子类实现自己的信息打印逻辑 public abstract void printInfo(); }
然后子类各自实现方法:
class JuniorInstructor extends Instructor { public JuniorInstructor(String id, String name) { super(id, name); } @Override public void printInfo() { System.out.println("[Junior] name: " + name + "\tid: " + id); } } class SeniorInstructor extends Instructor { public SeniorInstructor(String id, String name) { super(id, name); } @Override public void printInfo() { System.out.println("[Senior] name: " + name + "\tid: " + id); } }
最后简化Public类的check方法:
class Public<T extends Instructor> { public void check(T object) { // 直接调用多态方法,自动适配子类逻辑 object.printInfo(); } }
3. 避免使用原始泛型类型
你的代码中Public p = new Public();是原始类型,会丢失泛型的类型安全检查,编译时无法提前发现传入错误类型的对象。一定要指定泛型参数,比如Public<Instructor>或者Public<? extends Instructor>,这样编译阶段就能保障类型合法性。
总结
优先使用父类共性和多态来替代instanceof的类型判断,这不仅让代码更简洁,还能提升扩展性——后续新增MidInstructor之类的子类时,完全不需要修改Public类的代码,只需要让新子类继承Instructor并实现对应方法即可,完美符合开闭原则。
内容的提问来源于stack exchange,提问作者Munificient

