public int getPassengerCount() {
    int counter = 0;
    for (TrainCar vogn : YOLO) {
        if (vogn.getClass() == PassengerCar.class) {
            counter += ((PassengerCar) vogn).getPassengerCount(); //This line
        }
    } return counter;
}


在这段代码中,我遍历了ArraylistTrainCars

两种TrainCars类型; PassengerCarCargoCar。因此,首先我检查旅行车是否是类PassengerCar的实例(并且我知道instanceof,但我认为这种方式也可行?),如果是,则需要获取包含乘客人数,即方法getPassengerCount()

但是,在标记的行中,有一些我不完全了解的代码。我意识到我不能写vogn.getPassengerCount(),因为“ vogn”可能是CargoCarPassengerCar。再说一次,我在if子句之后进行,所以它不会导致错误。那为什么不能呢?为什么这是唯一可行的方法,它有什么作用?我从未见过这样的语法,老实说,我不知道对Google有什么了解。有什么建议吗? :-)

最佳答案

方法在编译时根据调用它们的表达式的静态/声明类型进行解析。

如您所述,getPassengerCount()方法仅存在于PassengerCar类型上。这样,您只能在解析为PassengerCar实例的表达式上调用该方法。您可以通过将类型为TrainCar的变量转换为更具体的PassengerCar来实现。

((PassengerCar) vogn)


仅当您知道vogn引用PassengerCar时,才执行此操作,否则将得到ClassCastException

09-28 14:01