class Animal { } class Dog extends Animal { } class Cat extends Animal { }
..Java's compilation of for each is smarter than C#
So this would not compile in Java:
private static void testAnimal() { Animal[] a = { new Dog(), new Cat() }; for(Dog d : a) { // Type mismatch: cannot convert from element type Animal to Dog System.out.println("Hey!"); } }
Whereas C# would happily compile the same construct:
static void testAnimal () { Animal[] a = { new Dog(), new Cat() }; foreach(Dog d in a) { Console.WriteLine ("Hey!"); } }
But that relaxed foreach would bite you where it hurts the most, i.e. during runtime. The above construct will produce this output and error during runtime:
Hey! Unhandled Exception: System.InvalidCastException: Cannot cast from source type to destination type. at ListInitializer.MainClass.testAnimal () [0x00017] in /Users/Michael/Projects/ListInitializer/ListInitializer/Main.cs:47 at ListInitializer.MainClass.Main (System.String[] args) [0x00000] in /Users/Michael/Projects/ListInitializer/ListInitializer/Main.cs:40 [ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidCastException: Cannot cast from source type to destination type. at ListInitializer.MainClass.testAnimal () [0x00017] in /Users/Michael/Projects/ListInitializer/ListInitializer/Main.cs:47 at ListInitializer.MainClass.Main (System.String[] args) [0x00000] in /Users/Michael/Projects/ListInitializer/ListInitializer/Main.cs:40
Cat is not compatible with Dog.
Though if the intention is to really iterate all Dogs only, you can do so by using OfType extension method:
static void testAnimal () { Animal[] a = { new Dog(), new Cat() }; foreach(Dog d in a.OfType<Dog>()) { Console.WriteLine ("Hey!"); } }
As of the time of this writing, Java still doesn't support extension method, this is where C# clearly trumps Java
To approximate the same in Java, you have to use good collections library (e.g. Guava):
private static void testAnimal() { Animal[] a = { new Dog(), new Cat() }; for(Dog d : Iterables.filter(Arrays.asList(a), Dog.class)) { System.out.println("Hey!"); } }
No comments:
Post a Comment