Most people will just use it to define collections of a given type.

Unfortunately they are very conservative and what they did is a bandaid. It is basically compiler magic, the generic type is erased and the compiler inserts the casts. In addition they came up with another bandaid for the primitive type problem, autoboxing, which is quite problematic. It is interesting to note that even the spec leads have come around to teh view that primitive types are an issue.