- No operator overloading. As a result, every container type is accessed differently. Arrays use . Lists use At(). Hashmaps use Get(). Matrices, vectors, and complex numbers are absurdly verbose, because I cannot overload addition and multiplication.
Arrays are rarely used in Java these days. All the collections API (Bloch's work on this has made it one of the few elegant parts of Java) use .get(), which is perfectly reasonable. If you're doing extensive work with matrices, vectors, etc. then Java is not an ideal choice of language, but 95% of programming tasks don't need it. Java isn't aimed at developing low-level game engines or scientific modelling.
- Type erasure for generics. As a result, I cannot define different function overloads for func(List) and func(List).
At least Java has generics. Unlike some other popular languages I could name... type erasure is a genuine annoyance but it's usually not too painful to work around.
- Lack of first class functions. As a result, callbacks required the absurdity of implementing the Callable interface. This has been improved recently with the addition of lambda statements.
Java is horribly verbose when you need to pass functions around but the new syntactic sugar makes functional programming a lot more viable. Even without it though you can stick to a strictly OO approach. This can make for clunky programming but does have the advantage of being boringly predictable in huge codebases being worked on by lots of coders of varying ability.
- Lack of properties. As a result, I cannot expose anything as public, because I might want to add additional code at some point in the future. Therefore, I must have an explosion of getters/setters.
It's not pretty, but this is a good excuse to make everything as immutable as possible and cut down on data access objects.
I like the idea of having a sandboxed virtual machine. I like the idea of having a single version of the bytecode that can run anywhere. I just can't stand the language.
Java isn't a lot of fun to code in most of the time but it's pretty effective at what it does.