Type Erasure is the reason you can't use builtin types as generic arguments. And in a lot of cases it forces you to cast.
And as type erasure happens very, very early in the compilation process, you lose a lot of static type information the compiler could act on or give you warnings.
No it wasn't necessary to maintain backwards compatibility. Type erasure was implemented to allow libraries to upgrade to generics without breaking compatibility with existing applications.
And as type erasure happens very, very early in the compilation process, you lose a lot of static type information the compiler could act on or give you warnings.