我有一个问题,但是我没有找到答案。假设我们在Java或C#中有以下代码:
class Car {
/* car stuff */
}
接下来,就是Java方面的内容了
class Truck extends Car {
/* truck stuff */
}
以及 C#
class Truck : Car {
/* truck stuff again */
}
在C#中,以下代码可以正常运行:
List<Car> carList = new List<Car>();
//add some objects to the collection
foreach(Truck t in carList)
//do stuff with only the Truck objects in the carList collection
这是因为卡车是汽车的子类,简单来说每辆卡车也都是一辆汽车。然而,类型检查会进行,只有卡车才会从carList中被选中。
如果我们在Java中尝试同样的操作:
List<Car> carList = new ArrayList<Car>();
//add some objects to the collection
for(Truck t : carList)
//**PROBLEM**
由于增强循环内部的代码,代码甚至无法编译。为了达到相同的效果,我们必须像这样做:
for(Car t : carList)
if(t instanceof Car)
//cast t to Truck and do truck stuff with it
在C#中可以轻松实现的同样的想法,在Java中需要额外的代码。即使语法几乎相同!有没有什么原因导致它在Java中无法工作?