答えが見つからない質問があります。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で動作しない理由はありますか?