我需要关于在方法[Java]中将孩子作为父亲传递的帮助

我需要关于在方法[Java]中将孩子作为父亲传递的帮助,java,inheritance,parameters,Java,Inheritance,Parameters,我需要帮助以一种期望有父亲的方法传递一个孩子,我将类Person作为超类,学生和教师是该类的子类,因此下面是一个关于我尝试的代码:/ public static void orderByName(ArrayList<Person> pArray){ Collections.sort(pArray, new Comparator<Person>(){ @Override public int compare(Person o1, Pe

我需要帮助以一种期望有父亲的方法传递一个孩子,我将类Person作为超类,学生和教师是该类的子类,因此下面是一个关于我尝试的代码:/

public static void orderByName(ArrayList<Person> pArray){
    Collections.sort(pArray, new Comparator<Person>(){
        @Override
        public int compare(Person o1, Person o2) {
            return o1.getName().compareTo(o2.getName());
        }
    });
}

public static void main(String[] args) {
    ArrayList<Student> estudiantes = new ArrayList<Student>();

    familiares.add(new Student("1235", "Name2", "SecondName2", "LastParameter2"));
    familiares.add(new Student("1234", "Name1", "SecondName1", "LastParameter1"));

    orderByName(estudiantes); //Pass an ArrayList of child but expects an ArrayList of father
}
我还需要这个方法和一个教师数组列表,所以,当子类型需要超类型时,是否可以传递它?谢谢我希望你能帮我一个学生就是一个人,所以你可以在需要的时候通过一个学生

一个人不一定是一个学生,所以当你期望一个学生时,你不能通过一个人


通常我们谈论子类、父类、基类等,也许可以多读一点正确的术语。

您可以使用

public static void orderByName(ArrayList<? extends Person> pArray)

简而言之,是的,当子类型需要超类型时,可以传递它

老师也是一个人——我想你的班级定义是这样的:

public class Teacher extends Person {
因此,教师也是一个人,因为您的方法需要一个人员数组列表,所以您可以传递一个教师数组列表

您还需要使用?在泛型中扩展Person—现在不要太担心它,因为您是Java的新手。首先尝试理解子类型/超类型和多态性的概念。在您对这两个方面都有了很好的理解之后,您应该仔细研究泛型

提示:您不应该期望一个具体类型的ArrayList

public static void orderByName(ArrayList<? extends Person> pArray){ // Dont do that
而是使用其超类型:

public static void orderByName(List<? extends Person> pArray){ 
同时更改列表分配给变量的位置:

 List<Student> estudiantes = new ArrayList<Student>();
不要在其他任何地方更改:


这里的区别是,现在您可以传递任何子类型的人的列表的任何子类型

感谢您的回复,当我给OrderByNamesStudients打电话时,我对Java有了新的认识;,我得到一个错误,它说类型主体中的orderByNameArrayList方法不适用于ArrayList参数:当我使用ArrayList时,这个建议实际上很好。当您声明集合或诸如此类的东西时,或者当您将其作为argumennt传递时,最好使用抽象类型作为接口。将ArrayList更改为在声明和参数列表中同时列出,它将起作用。让实例化部分保持原样。@nanokuro您应该只更改方法和创建对象列表的位置estudiantes=new ArrayList;你不能在其他任何地方改变。对不起,我误导了你。我已经更新了我的回复。