我有一个程序,其中有四个类Programmer
的对象以及一些其他所有继承我的父类Employee
的类。
因此,在我的main方法中,我将这些Employee
个对象存储在ArrayList
中。 Programmer
类的主要实例数据是' 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
课程中,在确定了{instance Programmer
的e instanceof后,如何让它查看对象的实例化类?
我也尝试过使用访问方法,但它只会在Employee
答案 0 :(得分:1)
您必须将其投射到Programmer
:
if (((Programmer) e).technologies.contains("Java"))
我们在括号中添加了(Programmer) e
,因为如果没有,它会尝试将contains
方法返回的内容(在本例中为布尔值)转换为Programmer
。< / p>
你也可以这样做:
Programmer programmer = (Programmer) e;
并非所有类型都可以投放到其他特定类型,因此使用instanceof
进行检查是避免ClassCastException
的好习惯。
答案 1 :(得分:0)
您有两种选择。按照你的方式做它你可以投下它。
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")){
}
}
}
然而,我不是这种技术的粉丝。我认为它在逻辑上令人困惑(为什么你的方法只关心程序员知道编程语言?为什么你必须知道你有什么子类?它只是凌乱)和丑陋的。
我会将一些功能移到超类中。在Employee中有一个方法knowsLanguage(String language)
。然后,对于从不知道任何编程语言的类,返回false,对于程序员,返回true / false。
您还可以更改instanceOf以使用类似的技术。 knowsProgramming()
在我脑海中更清晰(你可以添加其他程序员类没有问题,也许你想在以后的某个类中有程序员/设计师)