You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:20:32