有没有一种方法可以在继承中返回某种类型的列表?

时间:2021-07-13 07:31:36

标签: java inheritance arraylist

我有一个超类 Registration,它拥有另外两个子类,Student 和 Professional。在另一个班级中,我有一个管理注册的列表。

我必须预见这种方法:

public ArrayList<Registrations> getRegistrationsByTypes(int x) 

如果 x 为 0,该方法必须返回所有学生,而如果 x 为 1,它必须返回所有专业人士。你能告诉我它是怎么做的吗?

3 个答案:

答案 0 :(得分:0)

您可以使用流来过滤这些值,如下所示:

public List<Registrations> getRegistrationsByTypes(int x) {
    if (x == 0) {
        return registrations.stream()
            .filter(r -> r instanceof Student)
            .collect(Collectors.toList());
    } else if (x == 1) {
        return registrations.stream()
            .filter(r -> r instanceof Professional)
            .collect(Collectors.toList());
    }

    return Collections.emptyList(); //default if x not valid
}

答案 1 :(得分:0)

可以创建另一个类,该类在构造函数中采用 registrationList 并具有根据输入类型过滤注册的方法。通过这种方式,您可以将过滤功能放在具有注册列表的类之外(SOLID 中的 S 原则)

public class FilteredRegistrationByType {

List<Registration> regList = new ArrayList<Registration>();
public FilteredRegistrationByType(List<Registrations> regList)
{
    this.regList = regList;
}
public List<Registrations> getRegistrationsByTypes(int x) {
    if (x == 0) {
        return this.regList.stream()
            .filter(r -> r instanceof Student)
            .collect(Collectors.toList());
    } else if (x == 1) {
        return this.regList.stream()
            .filter(r -> r instanceof Professional)
            .collect(Collectors.toList());
    }

    return Collections.emptyList(); //default if x not valid
}
}

答案 2 :(得分:0)

您有两个选择。一个在超类中实现 getRegistrationsByTypes,两个在 Student 和 Professional 类中实现。

选项一:

    // Add this one to super calass and, Implement it in the sub classes
    public abstract ArrayList<Registrations> getRegisteration();
    
    public ArrayList<Registrations> getRegistrationsByTypes(int x){
        if (this instanceof Student && x == 0){
            return getRegisteration(); // It will returns all students
        } else if (this instanceof Professional && x == 1){
            return getRegisteration(); // It will returns all professionals
        }
        return null; // If it isn't student/professional or x > 1, x <0
    }

选项二:

    // Declare the following method in super class
    public abstract ArrayList<Registrations> getRegisteration(in x);
    

    // implement it in subclasses

    class Student{
    ...
    public ArrayList<Registrations> getRegistrationsByTypes(int x){
        if (x == 0){
            return registrationList;
        }
    }

    class Professional{
    ...
    public ArrayList<Registrations> getRegistrationsByTypes(int x){
        if (x == 1){
            return registrationList;
        }
    }

多态使选项二更好更简洁。