我有一个名为User的抽象类,可以将用户创建为学生类型或教师类型。我创建了一个用户(学生和教师)的ArrayList,我想要做的是根据当前对象的实例调用方法示例:
for (User user : listOfUsers) {
String name = user.getName();
if (user instanceof Student) {
// call getGrade();
} else { // it is an instance of a Teacher
// call getSubject();
}
}
我遇到的问题是因为它是User对象的ArrayList,它无法获取Student类型方法,例如getGrade()。但是,因为我能够确定当前用户的实例,我很好奇是否仍然可以根据用户的类型调用特定方法。
这是可能的,还是我必须将用户类型分成单独的列表?
请尽快回复,非常感谢。
答案 0 :(得分:5)
在使用该方法之前,您需要将它们投射到课堂上。
for (User user : listOfUsers) {
String name = user.getName();
if (user instanceof Student) {
Student tmp = (Student)user;
// call getGrade();
tmp.getGrade();
} else { // it is an instance of a Teacher
Teacher tmp = (Teacher)user;
// call getSubject();
tmp.getSubject();
}
}
答案 1 :(得分:4)
检查downcast:
在面向对象的编程中,向下转换或类型细化是 将基类的引用转换为其派生类之一的行为 类。
在许多编程语言中,可以通过类型进行检查 内省确定引用对象的类型 确实是被投射的人或其衍生类型,因此 如果不是这样,则发出错误。
换句话说,当基类(父类)的变量有一个 派生类(子类)的值,可以进行向下转换。
将您的代码更改为:
if (user instanceof Student) {
((Student) user).getGrade();
} else { // it is an instance of a Teacher
((Teacher) user).getSubject();
}
答案 2 :(得分:1)
将student和teacher对象存储在userList中,然后根据instanceOf条件通过typeCasting调用相应的类方法到UserType
请考虑以下示例代码
abstract class User{
public abstract String getName();
}
class Student extends User{
@Override
public String getName() {
// TODO Auto-generated method stub
return "Student";
}
public String getGrade(){
return "First Class";
}
}
class Teacher extends User{
@Override
public String getName() {
// TODO Auto-generated method stub
return "Teacher";
}
public String getSubject(){
return "Java";
}
}
public class Util {
public static void main(String[] args) {
Student s = new Student();
Teacher t = new Teacher();
ArrayList<User> list = new ArrayList<User>();
list.add(s);
list.add(t);
for(User user :list){
if(user instanceof Student){
System.out.println(((Student) user).getGrade());
}
if(user instanceof Teacher){
System.out.println(((Teacher) user).getSubject());
}
}
}
}