While operator overloading can be used for good, it is far more often used to create huge messes. It makes the simplest expressions impossible to understand locally because now, everywhere there is an operator, you cannot be sure what is actually going on. IMO, operator overloading is evil, despite the good intentions.
I hear you about type erasure for generics.
I hear you about lack of properties and the annoyance of getters/setters. IDEs help, but its not the same thing. (like kissing your boyfriend through a veil)