试图通过不同的 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")){
}
}
}
它在我的Employee
class中查找实例数据'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)
我有一个程序,其中有 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")){
}
}
}
它在我的Employee
class中查找实例数据'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)