我需要帮助将一个孩子作为父亲传递给一个方法[Java]

时间:2014-09-14 23:16:51

标签: java inheritance parameters

我需要关于在一个期望父亲的方法中传递Child的帮助,我将类Person作为超类,Student和Teacher是该类的子类,所以这里是关于我正在尝试的代码:/

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
}

我还需要这个方法和一个教师的ArrayList,所以,当它需要超类型时,是否可以传递一个子类型?谢谢,我希望你能帮助我^ _ ^

3 个答案:

答案 0 :(得分:1)

您可以使用

更改签名
public static void orderByName(ArrayList<? extends Person> pArray)

答案 1 :(得分:0)

A&#34;学生&#34; ISA &#34; Person&#34;,因此您可以在期望有人时传递学生。

A&#34;人&#34;不一定是&#34;学生&#34;,所以当学生被期待时你不能传递一个人。

通常我们会讨论子类,父类,基类等,或许会读一些关于正确术语的内容。

答案 2 :(得分:0)

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

教师也是一个人 - 我想你的课程定义是这样的:

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>();

不要在其他地方改变:)

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