加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 针对循环VS .NET foreach循环增强的Java

发布时间:2020-12-15 17:46:22 所属栏目:百科 来源:网络整理
导读:我有一个问题,我没有找到答案. 假设我们在 java或c#中有以下代码: class Car { /* car stuff */} 然后在Java中 class Truck extends Car { /* truck stuff */} 和C# class Truck : Car { /* truck stuff again */} 在C#中,以下工作正常: ListCar carList =
我有一个问题,我没有找到答案.
假设我们在 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中选择了Trucks.

如果我们在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中不起作用的原因?

解决方法

The thing is though,that type checking is done and only Trucks are selected from carList.

不,不是.如果您的列表包含除Trucks之外的任何内容,则C#中将发生运行时异常.基本上,在C#中,以下内容

foreach(Truck t in carList) {
    ...
}

表现得像

foreach(object _t in carList) {
    Truck t = (Truck)_t;        // throws an InvalidCastException if _t is not a Truck
    ...
}

另一方面,Java变体是类型安全的:您必须自己进行强制转换和类型检查.

那么,为什么Java和C#的行为不同?这是我的猜测:

C#在使用泛型之前有了foreach关键字.因此,不可能有List< Car>.如果C#选择了Java的foreach方式,你必须写

foreach(object _c in myArraylistContainingOnlyCars) {
    Car c = (Car)_c;
    // do something with c
}

这很烦人.另一方面,扩展的for循环和泛型在Java中引入了相同的版本(Java 5),因此不需要自动强制转换.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读