java - 如何在子类中使用泛型来限制方法参数类型?

标签 java generics inheritance overwrite

我有一个名为 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);
    }
}

学生:

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 generic 可能有用。

最佳答案

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

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
    }
}

关于java - 如何在子类中使用泛型来限制方法参数类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32835475/

相关文章:

c++ - 基类构造函数的段错误

java - 通过转换将 List<String> 转换为 List<Object> 甚至 List<Integer>

Java : How to get type of List<?>

generics - VHDL 泛型的使用

c++ - 将派生类转换为具有相同公共(public)函数的泛型类类型,同时仍然可以调用派生类的函数

java - 按内部对象的字段分组

java - 如何在特定 IP 地址上运行自己的 LanguageTool 4.0 实例

java - 通知 Activity 类

java - 具有特殊字符的 Ant 属性

c++ - 此C++代码将如何工作?