Java中为同一父类子类实现对应Printer接口的方案咨询
问题分析与解决方案
问题根源
你原来的写法给接口方法加了泛型<T extends Person>,这意味着任何实现Printer接口的类,都必须能处理所有继承自Person的子类。但WorkerPrinter里想调用Worker特有的getSalary(),编译器只知道T是Person的子类,但不确定具体是Worker,所以无法解析这个方法。
正确实现方式
把接口本身定义为泛型接口,而非给方法加泛型,这样每个实现类可以绑定到特定的Person子类:
1. 泛型化Printer接口
interface Printer<T extends Person> { void print(T person); }
2. 实现WorkerPrinter
指定泛型类型为Worker,此时print方法的参数就是Worker,可直接调用其特有方法:
class WorkerPrinter implements Printer<Worker> { @Override public void print(Worker person) { System.out.println(person.getName()); System.out.println(person.getSalary()); } }
3. 实现StudentPrinter
同理,绑定到Student类型:
class StudentPrinter implements Printer<Student> { @Override public void print(Student person) { System.out.println(person.getName()); System.out.println(person.getPoints()); } }
4. 使用示例
public class Main { public static void main(String[] args) { Worker worker = new Worker(); worker.setName("张三"); worker.setSalary(8000); Student student = new Student(); student.setName("李四"); student.setPoints(95); Printer<Worker> workerPrinter = new WorkerPrinter(); workerPrinter.print(worker); Printer<Student> studentPrinter = new StudentPrinter(); studentPrinter.print(student); } }
需求可行性说明
这种需求完全可行,属于典型的类型绑定+单一职责设计方式。后续如果新增Person的子类(比如Teacher),只需要新增对应的TeacherPrinter implements Printer<Teacher>即可,无需修改原有代码,符合开闭原则,在复杂项目中也能很好地维护。
内容的提问来源于stack exchange,提问作者Exeption_Error
相关产品推荐
相关产品推荐

