Generics or Specifics? 
A college of mine mentioned that Java "Generics" should in fact be called Java "Specifics". His reasoning goes something like this:
In C++ you have no top-level Object class so you can’t write generic code that works for objects of any class.
So in C++, you need some mechanism in order to write generic code, ie. “Generics”. In Java on the other hand, you have a top-level Object class
so you have no problem writing generic code. The Java collection classes are the most obvious example of this. I can use any of the standard java collections:
HashMap, ArrayList, TreeSet, etc. to store any class of Objects I choose. I can even use the same collection to store different types of Objects at the same time.
These classes are already generic. So the intent of Java’s “generics” is not to allow me to use any class, because I already had that capability. The intent of Java’s generics is actually the opposite:
to ensure that I only use a “specific” class/interface. Java generics take something that was already generic, and make it more specific, so should therefore be called “specifics”.
If Java specifics err…, I mean generics, don’t provide any new capabilities, then what is the point? Well, improved compile-time type-checked of course. Some people are really hot on this and think everything should be as static as possible. I disagree. Compile-time checking is generally a good thing but you need to achieve a good balance (Java) between safety (Ada), complexity (C++), and expressiveness (Smalltalk). Generics solve a problem that I’ve never had. I’ve been programming in Java for ten years now and I can say that it only happens to me about zero to two times a year that the wrong type of Object gets into a collection. I just don’t see the claimed advantages being worth the complexity. I’ve felt that, until generics at least, Java’s greatest strength has always been good judgement in its design which has kept it on the right side of the cost/benefit analysis of features (not counting EJB’s which aren’t part of the language). Leads to the path of dark-side (C++), generics do.
Another touted advantage of generics is performance. This isn’t an issue with Java however because of HotSpot’s use of method specialization. Method specialization (google it) is one of Java’s absolute greatest performance features and yet almost nobody is even aware that it exists.