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.