It's too verbose, it relies on DI to be testable, it has a weird type system (Integer vs int), the generic support is superficial, it lacks lambdas, releases are slow, it lacks a good web framework (yes, I've used play), some of it's behavior (checked exceptions, package-directory matching) are failed experiments.<p>Essentially, it hasn't evolved the way it probably should have. I am no fan of Microsoft, but, if you're going to have a general-purpose class-based static language using C-like syntax, C# is now as far ahead of Java as mutants are ahead of humans.<p>Also, there's a stigma attached to Java: code is over-architected, slow and eats memory like crazy. My experience certainly leads me to believe that this is true, though it seems to say a lot more about Java developers than Java itself.