一个ArrayList中的多个对象类型

Kur*_*iss 6 java abstract-class arraylist instanceof abstract

我有一个名为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();
  }
}
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是因为它是User对象的ArrayList,它无法获取Student类型方法,例如getGrade().但是,因为我能够确定当前用户的实例是什么,所以我很好奇是否仍然可以根据用户的类型调用特定方法.

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

请尽快回复,非常感谢.

Pat*_* II 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();
    }
}
Run Code Online (Sandbox Code Playgroud)


use*_*339 4

检查沮丧

在面向对象的编程中,向下转换或类型细化是将基类的引用转换为其派生类之一的行为。

在许多编程语言中,可以通过类型自省来检查以确定引用对象的类型是否确实是要转换的类型或其派生类型,如果不是这种情况,则发出错误。

换句话说,当基类(父类)的变量具有派生类(子类)的值时,向下转型是可能的。

将您的代码更改为:

if (user instanceof Student) {

    ((Student) user).getGrade();

  } else { // it is an instance of a Teacher

    ((Teacher) user).getSubject();
  }
Run Code Online (Sandbox Code Playgroud)