问题描述
我有一个超类Student
和两个子类RStudent
和CStudent
,它们继承自Student。我希望能够同时拥有ArrayList
和RStudent
中的一个CStudent
。我尝试仅使用ArrayList<Student> students = new Arraylist<>();
,但是无法访问特定于子类的任何变量,例如,如果我使用students.add(newCStudent)
,则当我尝试使用students.get(0).mark
(这是一个变量)时,仅在CStudent
中无效)。我该怎么办?
解决方法
您不能同时使用两种方式-如果您拥有List<Student>
来同时持有两种类型的Student
,则无法访问RStudent
或{{1 }},而无需明确地向下转换。例如
CStudent
,
- 我建议您声明通用类型
List
的引用,而不要声明ArrayList
本身,例如List<Student>
。 - 超类
Student
不应了解有关其子类的任何信息,即,为了使用子类的引用来访问子类的元素,您需要告诉编译器您要访问该元素通过使用超类的引用来定义子类,您可以通过向下转换来实现,即将超类的引用转换为子类的类型。 - 知道您可以使用运算符
instanceof
检查对象的类型也可能对您有所帮助。
例如
List<Student> students = new ArrayList<>();
CStudent s1 = new CStudent();
s1.setMark(90);
students.add(s1);
RStudent s2 = new RStudent();
students.add(s2);
//...and so on
for (Student student : students) {
if (student instanceof CStudent) {// Checking if the instance is of type,CStudent
CStudent s = (CStudent) student; // downcasting
System.out.println(s.getMark());// Assuming `CStudent` has `public` getter for mark
}
}