For #1, it doesn't matter-- without runtime help you loose half of the power of generics. In either case you aren't gaining anything. Your company is still writing without generics. If a.NET shop wanted to work with 1.1 then they wouldn't write generics either... no difference. The problem is forward compatibility. You "could" write with generics and they could work with non-generified JREs. In the trade-off I would prefer the runtime benefits (et al) any day of the week.
For #4- you don't understand what you are talking about. For good uses of yield (or closures) go ask one of the millions of Ruby fans that are convinced its the best thing ever. Note that your example of "Who is John Galt" is stupid. You can write bad code in any language-- programming languages aren't meant to "fix" stupid.
For #5- you clearly don't understand how type inference works. This is still static typing- its just that the type is inferred by the compiler (obviously at compile time) instead of having the coder type extra, unnecessary characters. It is NOT a "variant" type or widened type. It is only syntactic sugar to save you some keystrokes when declaring and initializing in the same statement (which should almost be required). No one is arguing against types or interfaces, etc. This is only to help reduce some superfluous typing. And YES this is in C++0x as well.
superior APIs that are decades ahead of anything at microsoft
Clearly has NO idea what he is talking about.
Has he used NIO?? Memory mapped files are useless because of the ridiculous API decisions they made (see #2 RFE on Sun's forums)
What about the lack of a good async file I/O (or Async anything!)?? Delegates are elegant, and very useful.
What about the lack of a rational file system abstraction!! So what "File" are you, canonical or abstract ? Are you a directory or a file...?
What about the ridiculous decision to make all of the original collections thread-safe a.k.a. Vector!?
Date, Calendar, and the case of the frustrating timezones!! Their date API has been terribly designed and released TWICE now!.NETs is excellent (TimeSpan)
Thankfully, in Java5 they fixed alot of the most embarassing problems: concurrency API, missing assert, missing enum, missing string format, etc, but their decision of Generics is just so frustrating. I understand their decision, but I just disagree. They believe that everything is based on "backwards compatibility". Since they believe that everyone runs on linux and enjoy dealing with PATH variables and other archaic crap, you have to tip toe when you have multiple versions of JREs installed. So in this sense, they are right to care! Who wants to deal with the frustrations of multiple JRE compatibilty issues!! What I LOVE is that many companies "solution" to this is to package the exact JRE with their solution. So eventually our computers will have 42 separate (almost) duplicate installations of JREs--yep they solved that one alright!.NET decides correctly what version to run, and multiple versions are only installed once without hassle. Do not underestimate this problem, my company has spent tons of hours diagnosing rediculously stupid problems with PATH variables and multiple versions of JREs installed- it costs money, which is kind of part of this "software" thing.
.NET has its own set of problems, but when it comes to APIs, Microsoft has done a fantastic job of creating an elegant set of APIs. Also, since they have solved the version compatibility problem- they aren't so afraid to introduce keywords into the language. I fully understand why Josh Bloche doesn't want to introduce new keywords (my java == your java, everyone reads with ease), but come ON a couple of well chosen keywords would probably make things MORE readable!
Where Java succeeds is its rich codebase and 3rd party components and tools- the community involvement make it the only viable environment for cutting edge, mission critical, enterprise development in my opinion (hello Terracotta and GigaSpaces + billions of other amazing components). This also, ironically, is one of its biggest problem-- with 40 solutions to the same problem, different groups inevitably choose different frameworks, which makes the code less readable (maintainable). Microsoft is a bottleneck, and thus it always ends up late to the party, but with a better API that learned from the mistakes of its predecessors. However, I'm still waiting for Visual Studio to catch up with Eclipse...
So don't dare argue Java's API especially using terms like "decades ahead", because you just look stupid and cleraly inexperienced. Java has had decades (unlike.NET) and it still has fundamental problems (see #5) that are so frustrating!! Some of the mistakes are just helarious, and while.NET contains its own silly mistakes- MS has been innovating at 2x the pace of Java, resulting in a much more rich/elegant language.
For #1, it doesn't matter-- without runtime help you loose half of the power of generics. In either case you aren't gaining anything. Your company is still writing without generics. If a .NET shop wanted to work with 1.1 then they wouldn't write generics either... no difference. The problem is forward compatibility. You "could" write with generics and they could work with non-generified JREs. In the trade-off I would prefer the runtime benefits (et al) any day of the week.
For #4- you don't understand what you are talking about. For good uses of yield (or closures) go ask one of the millions of Ruby fans that are convinced its the best thing ever. Note that your example of "Who is John Galt" is stupid. You can write bad code in any language-- programming languages aren't meant to "fix" stupid.
For #5- you clearly don't understand how type inference works. This is still static typing- its just that the type is inferred by the compiler (obviously at compile time) instead of having the coder type extra, unnecessary characters. It is NOT a "variant" type or widened type. It is only syntactic sugar to save you some keystrokes when declaring and initializing in the same statement (which should almost be required). No one is arguing against types or interfaces, etc. This is only to help reduce some superfluous typing. And YES this is in C++0x as well.
Thankfully, in Java5 they fixed alot of the most embarassing problems: concurrency API, missing assert, missing enum, missing string format, etc, but their decision of Generics is just so frustrating. I understand their decision, but I just disagree. They believe that everything is based on "backwards compatibility". Since they believe that everyone runs on linux and enjoy dealing with PATH variables and other archaic crap, you have to tip toe when you have multiple versions of JREs installed. So in this sense, they are right to care! Who wants to deal with the frustrations of multiple JRE compatibilty issues!! What I LOVE is that many companies "solution" to this is to package the exact JRE with their solution. So eventually our computers will have 42 separate (almost) duplicate installations of JREs--yep they solved that one alright! .NET decides correctly what version to run, and multiple versions are only installed once without hassle. Do not underestimate this problem, my company has spent tons of hours diagnosing rediculously stupid problems with PATH variables and multiple versions of JREs installed- it costs money, which is kind of part of this "software" thing.
Where Java succeeds is its rich codebase and 3rd party components and tools- the community involvement make it the only viable environment for cutting edge, mission critical, enterprise development in my opinion (hello Terracotta and GigaSpaces + billions of other amazing components). This also, ironically, is one of its biggest problem-- with 40 solutions to the same problem, different groups inevitably choose different frameworks, which makes the code less readable (maintainable). Microsoft is a bottleneck, and thus it always ends up late to the party, but with a better API that learned from the mistakes of its predecessors. However, I'm still waiting for Visual Studio to catch up with Eclipse...
So don't dare argue Java's API especially using terms like "decades ahead", because you just look stupid and cleraly inexperienced. Java has had decades (unlike .NET) and it still has fundamental problems (see #5) that are so frustrating!! Some of the mistakes are just helarious, and while .NET contains its own silly mistakes- MS has been innovating at 2x the pace of Java, resulting in a much more rich/elegant language.
Steve