Java Reference
In-Depth Information
Chapter 11. Generic Types
The problem with people who have no vices is that generally you
can be pretty sure they're going to have some pretty annoying vir-
tues.
Elizabeth Taylor
In the Java programming language, the class
Object
forms the root of
the class hierarchy, allowing other classes to deal with arbitrary types
saw a
SingleLinkQueue
class that used
Cell
objects to hold a reference to
any
Object
you wanted in the queue. This provides great flexibility, but
with some inconvenience: If you know that the elements in question are
String
objects, for example, then you have to cast the result of the
remove
method each time.
This use of
Object
as a generic reference is also potentially unsafethere
is nothing to stop the programmer from mistakenly adding a
Number
in-
stead of a
String
, with the mistake only discovered at runtime when the
cast applied to
remove
fails and a
ClassCastException
is thrown. To avoid
these problems you could define different queue classes to store partic-
ular types of elements, such as
SingleLinkStringQueue
or
SingleLinkNumber-
Queue
, but this has many drawbacks: It is tedious, inefficient, and error-
prone to duplicate code in this way; it is awkward to deal with an arbit-
rary kind of queue; and you could end up with numerous classes that are
identical except for the return and parameter types of a few methods.
Ideally, you would like to write a
SingleLinkQueue
that can be specialized
to contain any particular kind of object and then, for each queue object,
define which type it holds. That is where
generic types
come in.
To start, here's a new version of
Cell
declared as a generic class:
class Cell<E> {
private Cell<E> next;
private E element;
public Cell(E element) {