我们设置创建两个类,Person类和Teacher类,Teacher继承Person:
class Person {}
class Teacher extends Person {}
接下来我们创建对应对象的列表,并尝试互相赋值和添加,看下是否能够操作成功:
Listpersons = new ArrayList<>(); List teachers = new ArrayList<>(); // 1. 尝试将teachers列表赋值给persons persons = teachers; // 2. 尝试将persons列表复制给teachers teachers = persons; // 3. 尝试将teachers添加到persons persons.addAll(teachers); // 4. 尝试将persons添加到teachers teachers.addAll(persons);
我们将上面的1-4理解为独立的操作,各个操作之间互相不影响。
下面我们来猜测上面哪些可以正常执行:
1. 尝试将teachers列表赋值给persons
该代码会直接无法编译报错,声明的是List
2. 尝试将persons列表复制给teachers
该代码会直接无法编译报错,声明的是List
以上两种告诉我们,列表在指定了明确的类型后,在尝试赋值的时候必须要和声明的类型保持一致,否则就会编译报错。那么,如果是添加呢?
3. 尝试将teachers添加到persons
该代码可以正常执行,由于Teacher是Person的子类,那么在判断类型时,可以直接将Teacher的实例看做是一个Person,这个是没有问题的。
4. 尝试将persons添加到teachers
该代码会直接无法编译报错,我们可以说老师是一个人,但不能说一个人是老师。从代码层面讲,teachers.addAll()接收的参数类型为Collection extends Teacher>,也就是只有Teacher的子类,才可以。
以上是针对父类和子类的列表相互赋值和相互添加的测试和讲解,写代码没犯过这个错误,但是考试的时候记不清细节吃过几次亏,写下来加强记忆。



