【问题标题】:How to narrow cast parent class to child class如何将父类缩小到子类
【发布时间】:2022-12-21 14:11:11
【问题描述】:

我正在创建一个大学管理系统,其中有一个数据库类,我在其中存储类 User 的 currentUser 对象。成功登录后,currentUser 对象变为 Student 或 Teacher 对象(它们是 User 的子对象)。但是当我尝试在 currentUser 对象上调用 Student 的方法时,它不起作用。

这是当前用户对象: public static User currentUser; 所以 currentUser 没有初始化,我不想在这个阶段 downCast,

这是我授权用户的方式: `

if(student.getLogin().equals(login) && student.getPassword().equals(password)) {
                    currentUser = student;
                    isLogedIn = true;
                }

`

我尝试像这样将 User 类型转换为 Student : `

currentUser = student;
                    currentUser = (Student) currentUser;

` 但我仍然无法在 currentUser 上调用 Student 方法。我该如何解决?

【问题讨论】:

  • 您需要引入一个新变量,其类型为您要使用的变量:Student student = (Student) currentUser;,然后您可以在其上调用 Student 方法。或者在不声明像((Student) currentUser).someMethodOfStudent();这样的新变量的情况下内联它 你永远不能调用User currentUser上不属于类User的任何方法,只要它被声明为User
  • 有什么方法可以将 Student 对象存储到初始 User 变量中?
  • 转换并不神奇,也不会改变对象本质上是什么,只是编译器认为它是什么。您应该为您的类提供复制构造函数,以便可以从旧对象创建适当类的新对象。
  • 如果演员阵容有效(我假设)那么你已经做到了。如果对象已经不是 Student,则无法进行转换。我想问您的问题是,如果您似乎总是想使用 Student 及其方法,为什么还要将类型声明为 User?为什么不 Student currentUser 如果你的所有用户都是学生,那么就省去所有的麻烦吧?

标签: java oop inheritance casting


【解决方案1】:

currentUserUser 类型的变量,所以你只能通过它来使用它(和它的父类)的方法。

您可以将实际实例转换为 Student 并将其存储在该类型的临时变量中以使用 Student 的方法:

Student currentStudent = (Student) currentUser;
currentStudent.someStudentMethod();

当然,你也可以省略存储,直接在cast实例上调用方法:

((Student) currentUser).someStudentMethod();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多