There are a few different angles of generics.
Using generics to specify types in a collection is a convenience feature when you use specifics, ie:
This is what I call a "consumer" of
Java generics.
On the other hand, generics allow you to perform type-based logic where type is not known until runtime.
Lets say you have a specific type of product that you wish to remove from your collection - you could write a specific method that removes all "Gift" objects from the collection, or you could write a method that would allow you to remove whatever type the method caller wishes:
Type information is maintained, and you get the Gift objects out of the list.