私は答えが見つからない質問があります。Java拡張forループ.NETループforeach
class Car {
/* car stuff */
}
そしてJavaの
class Truck extends Car {
/* truck stuff */
}
と、次の作品だけで罰金のC#ではC#
class Truck : Car {
/* truck stuff again */
}
中:
我々はJavaや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がCarのサブクラスであり、簡単に言えば、各TruckもCarであることを意味します。しかし、そのタイプのチェックが行われ、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で動作しない理由はありますか?
すべてのトラックが車ではなく、すべての車がトラックである...ではC#の変換は、実行時に試されていますが、する必要がありますので、これは、C#でもとてもきれいではありません本当にそれに慎重。 Javaはもっと慎重に思えますし、プログラマが最初にチェックすることを望んでいます(もちろん、C#のバージョンは、あなたが何をしているのか分かっていればいくつかの利点があります)。 –
C#では、各オブジェクトの型がチェックされます。トラックの場合、foreachループの本体が入力されます。そうでない場合は、ループの本体が入力されます。それについて何が清潔でないのですか?私はそれをチェックするか(Java)、ランタイムはそれをチェックして(C#)、それは同じ最終結果です。 – alegen
@alegen、それは真実ではありません。 –