java - 如何避免 Java 向下转换?

标签 java downcast

我目前正在做一个项目,我有 3 个用户类,假设 UserA、UserB、UserC,它们继承自抽象的 User 类。

该程序应该模拟系统要求用户登录和注销。

这些用户的实例存储在 3 个单独的列表中。

任何时候只有一个用户被“登录”,所以我有一个 User currentUser 变量。

当我想调用特定于 UserA、B 或 C 的方法时,我会进行强制转换。 如何在保持代码优雅的同时避免进行这种转换?

代码示例:

public abstract class User {
}

public class UserA extends User {
    public void clearAgenda();
}

public class UserB extends User {
}

public class UserC extends User {
}

public class System {
    private User loggedUser;

    public void clearUserAgenda() {
        ((UserA) loggedUser).clearAgenda();
    }
}

注意: 我事先知道如果正在使用一个操作,则当前用户支持该操作。 (例如:如果调用 System.clearUserAgenda() 则用户是 UserA 的实例)

最佳答案

如果要避免转换,必须在抽象类 User 中声明方法 clearAgenda()。如果您不这样做,则只有 UserA 可以使用此方法,因此必须转换它。

关于java - 如何避免 Java 向下转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23816369/

相关文章:

error-handling - 当使用 catch_unwind 处理 panic 时,为什么不能将 Option.expect() 消息向下转换为 &'static str?

rust - 将 Ref<Box<dyn Any>> 向下转换为 Ref<Box<T>> 时处理向下转换错误

C++ 继承向下转型

java - 当只有某些实现提供正确的行为时是否对接口(interface)进行编码

Java HashMap 迭代每个变量并返回值

java - 如果类是类型,那么它们可以保存什么类型的数据?

java - 在 Java 的单例类中使用 "this"还是不使用它?

向下转换时出现 Swift 错误 'Any'

C++ QT 将 QList 中的项目转换为子类

java - 实现可比接口(interface)时出现编译错误