【问题标题】:How to use generic to restrict method parameter type in subclass?如何使用泛型限制子类中的方法参数类型?
【发布时间】:2015-12-26 10:22:10
【问题描述】:

我有一个名为Teacher 的父类定义如下:

import java.util.LinkedList;
import java.util.List;

public class Teacher {
    public List<Student> list = null;

    public Teacher(String id) {
        list = new LinkedList<Student>();
    }

    public void addStudent(Student tb){
        list.add(tb);
    }
}

Student:

public class Student {
    public String getStudentName(){
        return "student";
    }
}

还有一个扩展Teacher的子类和一个扩展Student的子类:

import java.util.List;

public class MathStudent extends Student{
    public String getStudentName(){
        return "math student";
    }
}

public class MathTeacher extends Teacher{

    public MathTeacher(String id) {
        super(id);
        // TODO Auto-generated constructor stub
    }
}

显然,MathTeacher 继承了方法addStudent。 但问题是,当我构造一个MathTeacher 对象并为其添加一个学生时,我只希望它是MathStudent 而不是Student,如下所示:

MathTeacher clc = new MathTeacher("a");
MathStudent tc = new MathStudent();
clc.add(tc);
Student student = new Student();
clc.add(student); // I want this line to throw compling error to avoid a Student object is added

我能做什么?我猜java泛型可能有用。

【问题讨论】:

    标签: java generics inheritance overwrite


    【解决方案1】:

    您可以通过以下方式实现它:

    public class Teacher <T extends Student> {
        public List<T> list = null;
    
        public Teacher(String id) {
            list = new LinkedList<T>();
        }
    
        public void addStudent(T tb){
            list.add(tb);
        }
    }
    
    public class MathTeacher extends Teacher <MathStudent> {
    
        public MathTeacher(String id) {
            super(id);
            // TODO Auto-generated constructor stub
        }
    }
    

    【讨论】:

    • 但是如果我不修改教师和学生类怎么办?
    • 如果 MathTeacher 在您的原始版本中扩展了 Teacher,那么有人可能希望将 MathTeacher 用作普通的 Teacher(它是 OOP 的多态部分)。因此,如果您不想更改老师,那么您应该允许人们将普通学生添加到 MathTeacher,因为它也是老师。
    • @Vico_Wu,即使你不想这样做也行。这是解决问题的最佳方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 2013-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    相关资源
    最近更新 更多