Цикл for для Java, улучшенный по сравнению с циклом foreach в.NET

У меня есть вопрос, на который я не нашел ответа. Допустим, у нас есть в 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

Это работает, потому что Truck является подклассом автомобиля, что простыми словами означает, что каждый грузовик также является автомобилем. Дело в том, что проверка типов выполняется, и из 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?

6
задан alegen 11 April 2012 в 07:27
поделиться