如何将父类强制转换为子类

How to narrow cast parent class to child class

提问人:MagentaPink 提问时间:12/20/2022 更新时间:12/20/2022 访问量:96

问:

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

这里是对象currentUser: 所以currentUser没有初始化,我不想在这个阶段向下投射,public static User currentUser;

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

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

`

我尝试像这样将用户类型转换为学生: `

currentUser = student;
                    currentUser = (Student) currentUser;

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

Java OOP 继承 转换

评论

0赞 12/20/2022
您需要引入一个新变量,其类型为:,然后您可以对其调用 Student 方法。或者在不声明新变量的情况下进行内联操作,例如 只要声明为 ,您就永远不能调用任何不属于类的方法。Student student = (Student) currentUser;((Student) currentUser).someMethodOfStudent();User currentUserUserUser
0赞 MagentaPink 12/20/2022
有什么方法可以将 Student 对象存储到初始 User 变量中?
0赞 DontKnowMuchBut Getting Better 12/20/2022
强制转换并不神奇,也不会改变对象的本质,只会改变编译器认为它是什么。您应该为类提供复制构造函数,以便可以从旧类创建相应类的新对象。
0赞 12/20/2022
如果铸造有效(我假设),那么你已经这样做了。如果对象还不是 Student,则强制转换将不起作用。我想问你的问题是,如果你似乎总是想使用它及其方法,为什么你声明了这个类型?如果你的所有用户都是学生,为什么不给自己带来那么多麻烦呢?UserStudentStudent currentUser
0赞 MagentaPink 12/20/2022
哦,我明白你在说什么,现在我明白了。谢谢大家的回答!

答:

0赞 Mureinik 12/20/2022 #1

currentUser是 类型的变量,因此您只能通过它使用它(及其父级)方法。User

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

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

当然,你也可以省略存储,直接在强制转换实例上调用该方法:

((Student) currentUser).someStudentMethod();