“generic” types: what’s in a name?

I’ve been stumbling over Java’s generic types for a while now…  I think I finally understand what my problem is:

They should be called specific types, or parametrised collections!

I think the feature is called “Java generics” because when you use a collection, say List<E>, that List contains elements of parameterised type <E>, a “generic type”.  But the element type in the plain old-fashioned non-parametrised collection List is also generic!  In fact the non-parametrised List is more generic than the “generic” version (it can contain elements of any sub-class of Object)!  The distinction is that the elements in a List<String> are all of one specific type (String), whereas the elements in a List can be of any general type, and can even be of different types in the same List collection (leading to problems that “Java generics” was invented to address).

<sarcasm>Gosh, what an epiphany.</sarcasm>

If you’re a Java guru this is nothing new, of course.  But that took me ages to grasp.  I think I wasn’t helped by the terminology.  In fact whenever I’m reading Java literature, it helps if I swap “generic” for “specific”.  This makes much more sense to me.  Actually I already do word substitutions for much of the Java canon.  For instance:

  • “class Foo is instantiated”
    Translation: “a Foo object is created”
  • “invoke method X of class Y”
    Translation: “send message X to a Y object”,
    or even “send class Y the X message”

Probably the Java literature is strictly more “correct” or explicit, but it’d be much more clear and concise if people used the older OOP words for things…