Generics comes with Java5 and the main idea of this is to avoid the well know exception ClassCastException. In your example, before Java5 we were used to iterate collections of object and casting it's on runtime, so the exception mentioned above happened very often.
With Generics this kind of runtime exception became a compile time exception and you are be able to realized these errors early. In your example you can choice if you want to handle this situation as a runtime error (option 1) or compilation error (option 2) and realize how easier is to handle it in the option 2.
Generics is more than just implicit or explicit declaration, you should take a look at this tutorial.