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