试图通过不同的 class 查看对象的实例数据

Trying to view instance data of an object through a different class

我有一个程序,其中有 class Programmer 的四个对象以及其他一些 class 对象,它们都继承了我的父对象 class、Employee.

所以在我的主要方法中,我将这些 Employee 对象存储在 ArrayList 中。 Programmer class 的主要实例数据是 'technologies' 并且它包含他们知道的各种技术的字符串。例如,'SQL'、'Java'、'Python'...等

好吧,我被卡住了,因为我需要确定我的程序员中有多少人知道 Java 并将他们的个人收入加起来等等。但是,当然,当我循环浏览我的 Employee ArrayList.. .

            for (Employee e : staff)
    {
        System.out.println(e.toString());
        salaryTotal += e.getSalary();
        if (e instanceof Programmer){
            programmerStaff++;
            if (e.technologies.contains("Java")){
            }
        }
    }

它在我的Employeeclass中查找实例数据'technologies',我确定后如何让它查看对象的实例化class e instanceof Programmer?

我也尝试过使用访问方法,但它只会在 Employee

中查找所述方法

您必须将其转换为 Programmer:

if (((Programmer) e).technologies.contains("Java"))

我们在括号中添加了 (Programmer) e,因为如果没有,它将尝试将 contains 方法 returns(在本例中为布尔值)转换为 Programmer.

您还可以这样做:

Programmer programmer = (Programmer) e;

并非所有类型都可以转换为另一种特定类型,因此使用 instanceof 检查是避免 ClassCastException.

的好习惯

你有两个选择。按照你正在做的方式去做,你可以施放它。

for (Employee e : staff){
    System.out.println(e.toString());
    salaryTotal += e.getSalary();
    if (e instanceof Programmer){
        programmerStaff++;
        Programmer p = (Programmer) e
        if (p.technologies.contains("Java")){
        }
    }
}

但是,我不喜欢这种技术。我认为这在逻辑上令人困惑(为什么你的方法应该关心只有程序员知道编程语言?为什么你必须知道你有什么 subclass?它只是混乱)和丑陋的苦行。

我会改为将一些功能移至超级class。在 Employee 中有一个方法 knowsLanguage(String language)。那么你 return 对于永远不懂任何编程语言的 class 人来说是错误的,而对于程序员来说 true/false 是错误的。

您也可以更改 instanceOf 以使用类似的技术。 knowsProgramming() 在我看来更干净(你可以毫无问题地添加其他程序员 class,也许你以后想在一个 class 中加入 programmer/designers)