一个ArrayList中的多个对象类型

时间:2014-04-10 13:01:26

标签: java arraylist abstract-class abstract instanceof

我有一个名为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()。但是,因为我能够确定当前用户的实例,我很好奇是否仍然可以根据用户的类型调用特定方法。

这是可能的,还是我必须将用户类型分成单独的列表?

请尽快回复,非常感谢。

3 个答案:

答案 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());
            }
        }
}
}