Let's not forget about type-erasure generics. And the existence of arrays. And the fact that people still use arrays.
Type-erasure generics are a fortuitous platform decision, because its what enables languages on the platform to have a good interop story while still having a more robust type system than Java does -- case in point, Scala, and why the .NET version died.
But type-erasure of generics - that's the decision with which we will need to live till the end of time.
- no multiple implementation of same generic interface
- small performance hits..
- a lot more but I'm just sleepy right now.