public int getPassengerCount() {
int counter = 0;
for (TrainCar vogn : YOLO) {
if (vogn.getClass() == PassengerCar.class) {
counter += ((PassengerCar) vogn).getPassengerCount(); //This line
}
} return counter;
}
在此代码中,我遍历Arraylist
TrainCars
。
两种TrainCars
; PassengerCar
或CargoCar
。所以首先我检查旅行车是否是班级PassengerCar
的一个实例(我知道instanceof
,但我认为这种方式有效吗?),如果是的话,我需要抓住包含乘客数量的字段,即方法getPassengerCount()
。
然而,在标记的行中,有一些我不完全理解的代码。我意识到我不能写vogn.getPassengerCount()
,因为" vogn"可以是CargoCar
或PassengerCar
。然后,我在if子句之后再这样做,所以它不应该导致错误。那我为什么不呢?为什么这是唯一可行的方式,它的作用是什么?我从来没有见过这样的语法,老实说我不知道谷歌是什么。有什么建议? : - )
答案 0 :(得分:3)
在编译时,方法基于调用它们的表达式的静态/声明类型来解析。
正如您所说,getPassengerCount()
方法仅存在于PassengerCar
类型上。因此,您只能在解析为PassengerCar
实例的表达式上调用该方法。您可以通过将类型为TrainCar
的变量转换为更具体的PassengerCar
来实现此目的。
((PassengerCar) vogn)
仅当您知道vogn
引用PassengerCar
时才执行此操作,否则您将获得ClassCastException
。
答案 1 :(得分:1)
(假设TrainCar
没有getPassengerCount()
方法)
嗯,假设说明了一切。 vogn
包含对TrainCar
而非PassengerCar
的实例的引用。由于TrainCar
没有该方法,因此您需要将其向下转换为具有该方法的子类。这就是为什么演员阵容是必需的,即使你是程序员,现在你已经拥有PassengerCar
的实例。
答案 2 :(得分:1)
counter += ((PassengerCar) vogn).getPassengerCount(); //This line
如果vogn
是PassengerCar
的实例,则会将该车中的乘客数量与乘客总数相加。
因此,有必要将vogn
对象强制转换为其子类以访问方法getPassengerCount()
(TrainCar
中可能不存在public int getPassengerCount() {
int counter = 0;
for (TrainCar vogn : YOLO) {
if (vogn instanceof PassengerCar) { //This is easier :-)
counter += ((PassengerCar) vogn).getPassengerCount();
}
} return counter;
}
})。
更好的方法是:
{{1}}
答案 3 :(得分:1)
我认为这个问题更像是为什么Java会以这种方式做出反应?"比#34;这是正常的吗?"。 想想另一种方式,如果你的情况如何
if (vogn instanceof PassengerClass || a == b)
然后,如果a == b和vogn不是PassengerClass的实例,那么您将调用一个可能与PassengerClass不同的类的方法。 在某种情况下可能有许多陈述的事实似乎是一个很好的理由,说明为什么你所说的语法是危险的。