1
18
Generics
1992-2007 Pearson Education, Inc. All rights reserved.
Every man of genius sees the world at a different
angle from his fellows.
Havelock Ellis
our special individuality, as distinguished from
our generic humanity.
Oliver Wendell Holmes, Sr.
Born under one law, to another bound.
Lord Brooke
You deal in the raw material of opinion, and, if my
convictions have any validity, opinion ultimately
governs the world.
Woodrow Wilson
1992-2007 Pearson Education Inc. All rights reserved.
OBJECTIVES
In this chapter you will learn:
To create generic methods that perform identical
tasks on arguments of different types.
To create a generic Stack class that can be used to
store objects of any class or interface type.
To understand how to overload generic methods with
non-generic methods or with other generic methods.
To understand raw types and how they help achieve
backwards compatibility.
To use wildcards when precise type information about a
parameter is not required in the method body.
The relationship between generics and inheritance.
1992-2007 Pearson Education, Inc. All rights reserved.
18.1 Introduction
18.2 Motivation for Generic Methods
18.3 Generic Methods: Implementation and Compile-Time
Translation
18.4 Additional Compile-Time Translation Issues:
18.5 Overloading Generic Methods
18.6 Generic Classes
18.7 Raw Types
18.8 Wildcards in Methods That Accept Type Parameters
18.9 Generics and Inheritance: Notes
18.10 Wrap-Up
18.11 Internet and Web Resources
1992-2007 Pearson Education, Inc. All rights reserved.
18.1 Introduction
Generics
New feature of J2SE 5.0
Provide compile-time type safety
Catch invalid types at compile time
Generic methods
A single method declaration
A set of related methods
Generic classes
A single class declaration
A set of related clases
1992-2007 Pearson Education, Inc. All rights reserved.
Software Engineering Observation 18.1
Generic methods and classes are among Javas
most powerful capabilities for software reuse
with compile-time type safety.
1992-2007 Pearson Education, Inc. All rights reserved.
18.2 Motivation for Generic Methods
Overloaded methods
Perform similar operations on different types of data
Overloaded printArray methods
Integer array
Double array
Character array
Only reference types can be used with generic methods and
classes
1992-2007 Pearson Education, Inc. All rights reserved.
1
2
// Fig. 18.1: [Link]
// Using overloaded methods to print array of different types.
3
4
5
6
7
8
9
10
public class OverloadedMethods
{
// method printArray to print Integer array
public static void printArray( Integer[] inputArray )
{
Method printArray accepts
// display array elements
an array of Integer objects
for ( Integer element : inputArray )
[Link]( "%s ", element );
11
12
13
[Link]();
14
15
16
17
} // end method printArray
18
19
20
21
22
23
24
25
// method printArray to print Double array
public static void printArray( Double[] inputArray )
// display array elements
for ( Double element : inputArray )
[Link]( "%s ", element );
Method printArray accepts
an array of Double objects
[Link]();
} // end method printArray
1992-2007 Pearson Education, Inc. All rights reserved.
26
// method printArray to print Character array
27
public static void printArray( Character[] inputArray )
28
29
// display array elements
30
for ( Character element : inputArray )
Method printArray accepts
an array of Character objects
[Link]( "%s ", element );
31
32
[Link]();
33
34
} // end method printArray
35
36
public static void main( String args[] )
37
38
// create arrays of Integer, Double and Character
39
Integer[] integerArray = { 1, 2, 3, 4, 5, 6 };
40
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
41
Character[] characterArray = { 'H', 'E', 'L', 'L', 'O' };
42
1992-2007 Pearson Education, Inc. All rights reserved.
43
[Link]( "Array integerArray contains:" );
44
printArray( integerArray ); // pass an Integer array
45
[Link]( "\nArray doubleArray contains:" );
46
printArray( doubleArray ); // pass a Double array
47
48
49
10
At compile time, the compiler determines argument
integerArrays type (i.e., Integer[]), attempts
[Link]( "\nArray characterArray contains:" );
to locate a method named printArray that
printArray( characterArray ); // pass a Character array
specifies a single Integer[] parameter (lines 7-14)
} // end main
50 } // end class OverloadedMethods
Array integerArray contains:
1 2 3 4 5 6
Array doubleArray contains:
1.1 2.2 3.3 4.4 5.5 6.6 7.7
Array characterArray contains:
H E L L O
At compile time, the compiler determines argument
doubleArrays type (i.e., Double[]), attempts to
locate a method named printArray that specifies
a single Double[] parameter (lines 17-24)
At compile time, the compiler determines argument
characterArrays type (i.e., Character[]),
attempts to locate a method named printArray that
specifies a single Character[] parameter (lines 2734)
1992-2007 Pearson Education, Inc. All rights reserved.
11
18.2 Motivation for Generic Methods
(Cont.)
Study each printArray method
Array element type appears in two location
Method header
for statement header
Combine three printArray methods into one
Replace the element types with a generic name E
Declare one printArray method
Display the string representation of the elements of any array
1992-2007 Pearson Education, Inc. All rights reserved.
public static void printArray( E[] inputArray )
// display array elements
for ( E element : inputArray )
Replace the element type with
a single generic type E
[Link]( "%s ", element );
Replace the element type with
a single generic type E
6
7
12
[Link]();
} // end method printArray
Fig. 18.2
| printArray method in which actual type names are replaced by
convention with the generic name E.
1992-2007 Pearson Education, Inc. All rights reserved.
13
18.3 Generic Methods: Implementation
and Compile-Time Translation
Reimplement Fig. 18.1 using a generic method
Method calls are identical
Outputs are identical
Generic method declaration
Type parameter section
Delimited by angle brackets ( < and > )
Precede the methods return type
Contain one or more type parameters
Also called formal type paramters
1992-2007 Pearson Education, Inc. All rights reserved.
14
18.3 Generic Methods: Implementation
and Compile-Time Translation
Type parameter
Also known as type variable
An identifier that specifies a generic type name
Used to declare return type, parameter types and local
variable types
Act as placeholders for the types of the argument passed to
the generic method
Actual type arguments
Can be declared only once but can appear more than once
public static < E > void printTwoArrays(
E[] array1, E[] array2 )
1992-2007 Pearson Education, Inc. All rights reserved.
15
Common Programming Error 18.1
When declaring a generic method, failing to place
a type parameter section before the return type of
a method is a syntax errorthe compiler will not
understand the type parameter name when it is
encountered in the method.
1992-2007 Pearson Education, Inc. All rights reserved.
1
2
// Fig. 18.3: [Link]
// Using generic methods to print array of different types.
3
4
public class GenericMethodTest
6
7
8
9
16
Use the type parameter to declare
method printArrays parameter type
// generic method printArray
public static < E > void printArray( E[] inputArray )
{
Type parameter section
// display array elements
delimited
inputArray by
) angle brackets (< and > )
10
11
12
for ( E element :
[Link]( "%s ", element );
13
[Link]();
Use the type parameter to declare method
printArrays local variable type
14
15
} // end method printArray
16
17
18
19
20
21
22
public static void main( String args[] )
{
// create arrays of Integer, Double and Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
1992-2007 Pearson Education, Inc. All rights reserved.
23
[Link]( "Array integerArray contains:" );
24
printArray( integerArray ); // pass an Integer array
25
[Link]( "\nArray doubleArray contains:" );
26
printArray( doubleArray ); // pass a Double array
27
[Link]( "\nArray
28
printArray( characterArray ); // pass a Character array
29
} // end main
30 } // end class GenericMethodTest
17
Invoke generic method printArray
withcontains:"
an Integer
characterArray
); array
Invoke generic method printArray
with a Double array
Array integerArray contains:
1 2 3 4 5 6
Array doubleArray contains:
1.1 2.2 3.3 4.4 5.5 6.6 7.7
Invoke generic method printArray
with a Character array
Array characterArray contains:
H E L L O
1992-2007 Pearson Education, Inc. All rights reserved.
18
Good Programming Practice 18.1
It is recommended that type parameters be
specified as individual capital letters. Typically,
a type parameter that represents the type of an
element in an array (or other collection) is
named E for element.
1992-2007 Pearson Education, Inc. All rights reserved.
19
Common Programming Error 18.2
If the compiler cannot match a method call to
a non-generic or a generic method declaration,
a compilation error occurs.
1992-2007 Pearson Education, Inc. All rights reserved.
20
Common Programming Error 18.3
If the compiler does not find a method declaration
that matches a method call exactly, but does find
two or more generic methods that can satisfy the
method call, a compilation error occurs.
1992-2007 Pearson Education, Inc. All rights reserved.
21
18.3 Generic Methods: Implementation
and Compile-Time Translation (Cont.)
Compile-time translation
Erasure
Remove type parameter section
Replace type parameters with actual types
Default type is Object
1992-2007 Pearson Education, Inc. All rights reserved.
public static void printArray( Object[] inputArray )
// display array elements
for ( Object element : inputArray )
Remove type parameter section and replace
type parameter with actual type Object
[Link]( "%s ", element );
6
7
22
[Link]();
Replace type parameter with
actual type Object
} // end method printArray
Fig. 18.4
| Generic method printArray after erasure is performed by the
compiler.
1992-2007 Pearson Education, Inc. All rights reserved.
18.4 Additional Compile-Time Translation
Issues: Methods That Use a Type Parameter as
the Return Type
23
Application of Fig. 18.5
Generic method
Use Type parameters in the return type and parameter list
Generic interface
Specify, with a single interface declaration, a set of related types
E.g., Comparable< T >
Method [Link]( integer2 )
Compare two objects of the same class
Return 0 if two objects are equal
Return -1 if integer1 is less than integer2
Return 1 if integer1 is greater than integer2
1992-2007 Pearson Education, Inc. All rights reserved.
// Fig. 18.5: [Link]
// Generic method maximum returns the largest of three objects.
3
4
public class MaximumTest
5
6
7
8
9
{
// determines the largest of three Comparable objects
public static < T extends Comparable< T > > T maximum( T x, T y, T z )
{
Type parameter
Typesection
parameter
specifies
is usedthat
in
T max = x; // assume x is initially the largest
10
11
12
13
14
15
16
17
18
24
if
the
only
returnthat
typeimplement
of methodinterface
maximum
objectmax
of classes
Assign x to local variable
( [Link]( max ) > 0 )
Comparable can be used with this method
max = y; // y is the largest so far
Invokes method compareTo method
Comparable to compare y and max
if ( [Link]( max ) > 0 )
max = z; // z is the largest
return max; // returns the largest object
} // end method maximum
Invokes method compareTo method
Comparable to compare z and max
19
1992-2007 Pearson Education, Inc. All rights reserved.
20
public static void main( String args[] )
21
22
23
24
25
26
27
25
[Link]( "Maximum of %d, %d and %d is %d\n\n", 3, 4, 5,
maximum( 3, 4, 5 ) );
Invoke generic method
maximum with three integers
[Link]( "Maximum of %.1f, %.1f and %.1f is %.1f\n\n",
6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );
[Link]( "Maximum of %s, %s and %s is %s\n", Invoke
"pear",generic
"apple", "orange", maximum( "pear", "apple",
28
} // end main
29 } // end class MaximumTest
method
"orange"
) );
maximum
with three doubles
Invoke generic method
maximum with three strings
Maximum of 3, 4 and 5 is 5
Maximum of 6.6, 8.8 and 7.7 is 8.8
Maximum of pear, apple and orange is pear
1992-2007 Pearson Education, Inc. All rights reserved.
18.4 Additional Compile-Time Translation
Issues: Methods That Use a Type Parameter as
the Return Type (Cont.)
26
Upper bound of type parameter
Default is Object
Always use keyword extends
E.g., T extends Comparable< T >
When compiler translates generic method to Java bytecode
Replaces type parameter with its upper bound
Insert explicit cast operation
e.g., line 23 of Fig. 18.5 I preceded by an Integer cast
(Integer) maximum( 3, 4, 5 )
1992-2007 Pearson Education, Inc. All rights reserved.
public static Comparable maximum(Comparable x, Comparable y, Comparable z)
parameter T
with its upper bound Comparable
Erasure replaces
type
Comparable max = x; // assume x is initially
the largest
4
5
6
if ( [Link]( max ) > 0 )
max = y; // y is the largest so far
7
8
9
27
if ( [Link]( max ) >
Erasure replaces type parameter T
0with
) its upper bound Comparable
max = z; // z is the largest
10
11
return max; // returns the largest object
12 } // end method maximum
1992-2007 Pearson Education, Inc. All rights reserved.
28
18.5 Overloading Generic Method
Generic method may be overloaded
By another generic method
Same method name but different method parameters
By non-generic methods
Same method name and number of parameters
When compiler encounters a method call
Search for most precise matching method first
Exact method name and argument types
Then search for inexact but applicable matching method
1992-2007 Pearson Education, Inc. All rights reserved.
29
18.6 Generic Classes
Generic classes
Use a simple, concise notation to indicate the actual type(s)
At compilation time, Java compiler
ensures the type safety
uses the erasure technique to enable client code to interact
with the generic class
Parameterized classes
Also called parameterized types
E.g., Stack< Double >
1992-2007 Pearson Education, Inc. All rights reserved.
30
18.6 Generic Classes (Cont.)
Generic class declaration
Looks like a non-generic class declaration
Except class name is followed by a type parameter section
The Xlint:unchecked option
Compiler cannot 100% ensure type safety
1992-2007 Pearson Education, Inc. All rights reserved.
// Fig. 18.7: [Link]
2
3
// Generic class Stack.
public class Stack< E >
6
7
8
31
Generic class declaration, class name is
section
private final int size; // number of elements in the stack
followed by a type parameter
private int top; // location of the top element
private E[] elements; // array that stores stack elements
Declare elements as an array
10
11
// no-argument constructor creates a stack of the default size
that stores objects of type E
public Stack()
12
13
14
15
16
17
18
19
20
21
22
23
24
} // end no-argument Stack constructor
this( 10 ); // default stack size
// constructor creates a stack of the specified number of elements
public Stack( int s )
{
size = s > 0 ? s : 10; // set size of Stack
top = -1; // Stack initially empty
elements = ( E[] ) new Object[ size ]; // create array
} // end Stack constructor
Create
an array of type E. The generic
mechanism does not allow type parameter
in array-creation expressions because the
type parameter is not available at runtime
1992-2007 Pearson Education, Inc. All rights reserved.
25
// push element onto stack; if successful, return true;
26
// otherwise, throw FullStackException
27
public void push( E pushValue )
28
29
Method push pushes
element of type E onto stack
[Link](
if ( top == size - 1 ) // if stack is full
throw new FullStackException(
"Stack is full, cannot push %s", pushValue ) );
30
31
32
33
elements[ ++top ] = pushValue; // place pushValue on Stack
34
} // end method push
35
36
37
// return the top element if not empty; else throw EmptyStackException
public E pop()
38
39
40
41
32
Method pop returns the top
if ( top == -1 ) // if element,
stack is which
empty is of type E
throw new EmptyStackException( "Stack is empty, cannot pop" );
42
return elements[ top-- ]; // remove and return top element of Stack
43
} // end method pop
44 } // end class Stack< E >
1992-2007 Pearson Education, Inc. All rights reserved.
// Fig. 18.8: [Link]
// Indicates a stack is full.
3
4
public class FullStackException extends RuntimeException
{
5
6
// no-argument constructor
public FullStackException()
8
9
this( "Stack is full" );
} // end no-argument FullStackException constructor
10
11
// one-argument constructor
12
13
14
public FullStackException( String exception )
{
super( exception );
33
15
} // end one-argument FullStackException constructor
16 } // end class FullStackException
1992-2007 Pearson Education, Inc. All rights reserved.
// Fig. 18.9: [Link]
// Indicates a stack is full.
public class EmptyStackException extends RuntimeException
5
6
// no-argument constructor
public EmptyStackException()
7
8
9
{
this( "Stack is empty" );
} // end no-argument EmptyStackException constructor
10
11
// one-argument constructor
12
13
14
public EmptyStackException( String exception )
{
super( exception );
34
15
} // end one-argument EmptyStackException constructor
16 } // end class EmptyStackException
1992-2007 Pearson Education, Inc. All rights reserved.
35
18.6 Generic Classes (Cont.)
Generic class at compilation time
Compiler performs erasure on classs type parameters
Compiler replaces type parameters with their upper bound
Generic class test program at compilation time
Compiler performs type checking
Compiler inserts cast operations as necessary
1992-2007 Pearson Education, Inc. All rights reserved.
// Fig. 18.10: [Link]
// Stack generic class test program.
36
3
4
5
public class StackTest
{
6
7
8
private double[] doubleElements = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 };
private int[] integerElements = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
9
10
11
12
private Stack< Double > doubleStack; // stack stores Double objects
private Stack< Integer > integerStack; // stack stores Integer objects
// test Stack objects
13
public void testStacks()
14
15
16
17
18
19
20
21
22
23
Generic class Stacks type
argument is Double
Generic class Stacks type
argument is Integer
// Stack of Doubles
doubleStack = new Stack< Double >( 5 );
integerStack = new Stack< Integer >( 10 ); // Stack of Integers
testPushDouble(); // push double onto doubleStack
testPopDouble(); // pop from doubleStack
testPushInteger(); // push int onto intStack
testPopInteger(); // pop from intStack
Instantiate object doubleStack of
size 5 and ingeterStack of size 10
} // end method testStacks
1992-2007 Pearson Education, Inc. All rights reserved.
24
25
// test push method with double stack
public void testPushDouble()
26
27
{
// push elements onto stack
28
try
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
37
[Link]( "\nPushing elements onto doubleStack" );
// push elements to Stack
for ( double element : doubleElements )
{
[Link]( "%.1f ", element );
[Link]( element ); // push onto doubleStack
} // end for
} // end try
catch ( FullStackException fullStackException )
{
[Link]();
[Link]();
} // end catch FullStackException
} // end method testPushDouble
Invoke Stacks method push to place
a double value onto doubleStack
1992-2007 Pearson Education, Inc. All rights reserved.
46
// test pop method with double stack
47
public void testPopDouble()
48
49
50
51
52
53
54
55
56
{
// pop elements from stack
try
{
[Link]( "\nPopping elements from doubleStack" );
double popValue; // store element removed from stack
// remove all elements from Stack
while ( true )
{
57
popValue = [Link](); // pop from doubleStack
58
59
60
61
62
[Link]( "%.1f ", popValue );
} // end while
} // end try
catch( EmptyStackException emptyStackException )
63
64
65
66
67
68
38
Auto-unboxing occurs when the value
returned by pop (Double) is assigned
to a double primitive variable
[Link]();
[Link]();
} // end catch EmptyStackException
} // end method testPopDouble
1992-2007 Pearson Education, Inc. All rights reserved.
69
70
// test push method with integer stack
public void testPushInteger()
71
72
// push elements to stack
73
try
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
39
[Link]( "\nPushing elements onto intStack" );
// push elements to Stack
for ( int element : integerElements )
{
[Link]( "%d ", element );
[Link]( element ); // push onto integerStack
} // end for
} // end try
catch ( FullStackException fullStackException )
{
[Link]();
[Link]();
} // end catch FullStackException
} // end method testPushInteger
Invoke Stacks method push to place
an int value onto integerStack
1992-2007 Pearson Education, Inc. All rights reserved.
91
92
// test pop method with integer stack
public void testPopInteger()
93
40
// pop elements from stack
try
{
94
95
96
97
98
99
100
[Link]( "\nPopping elements from intStack" );
int popValue; // store element removed from stack
101
102
103
104
while ( true )
{
popValue = [Link](); // pop from intStack
[Link]( "%d ", popValue );
Auto-unboxing
// remove all elements from Stack
} // end while
} // end try
catch( EmptyStackException emptyStackException )
{
105
106
107
108
109
110
111
112
[Link]();
[Link]();
} // end catch EmptyStackException
} // end method testPopInteger
113
114
public static void main( String args[] )
115
116
occurs when the value
returned by pop (Integer) is assigned
to an int primitive variable
{
StackTest application = new StackTest();
117
[Link]();
118
} // end main
119 } // end class StackTest
1992-2007 Pearson Education, Inc. All rights reserved.
41
Pushing elements onto doubleStack
1.1 2.2 3.3 4.4 5.5 6.6
FullStackException: Stack is full, cannot push 6.6
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
Popping elements from doubleStack
5.5 4.4 3.3 2.2 1.1
EmptyStackException: Stack is empty, cannot pop
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
Pushing elements onto integerStack
1 2 3 4 5 6 7 8 9 10 11
FullStackException: Stack is full, cannot push 11
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
Popping elements from integerStack
10 9 8 7 6 5 4 3 2 1
EmptyStackException: Stack is empty, cannot pop
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
1992-2007 Pearson Education, Inc. All rights reserved.
42
18.6 Generic Classes (Cont.)
Creating generic methods to test class Stack< E >
Method testPush
Perform same tasks as testPushDouble and
testPushInteger
Method testPop
Perform same tasks as testPopDouble and
testPopInteger
1992-2007 Pearson Education, Inc. All rights reserved.
// Fig. 18.11: [Link]
2
3
// Stack generic class test program.
public class StackTest2
5
6
7
8
9
10
11
12
13
14
43
private Double[] doubleElements = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 };
private Integer[] integerElements =
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
private Stack< Double > doubleStack; // stack stores Double objects
private Stack< Integer > integerStack; // stack stores Integer objects
// test Stack objects
public void testStacks()
15
16
17
18
19
20
21
22
23
24
testPush( "integerStack", integerStack, integerElements
); generic methods testPush and
Invoke
testPop( "integerStack", integerStack );
testPop to push elements onto stack
} // end method testStacks
doubleStack = new Stack< Double >( 5 ); // Stack of Doubles
integerStack = new Stack< Integer >( 10 ); // Stack of Integers
testPush( "doubleStack", doubleStack, doubleElements );
testPop( "doubleStack", doubleStack );
and pop elements from stack
1992-2007 Pearson Education, Inc. All rights reserved.
25
// generic method testPush pushes elements onto a Stack
26
public < T > void testPush( String name, Stack< T > stack,
27
28
29
30
31
32
T[] elements )
Generic method testPush replaces
testPushDouble and testPushInteger
// push elements onto stack
try
{
[Link]( "\nPushing elements onto %s\n", name );
33
34
// push elements onto Stack
35
36
for ( T element : elements )
{
Replace element type Double/Integer
with type parameter T
37
[Link]( "%s ", element );
38
39
40
41
[Link]( element ); // push element onto stack
}
} // end try
catch ( FullStackException fullStackException )
42
43
44
45
46
44
[Link]();
[Link]();
} // end catch FullStackException
} // end method testPush
47
1992-2007 Pearson Education, Inc. All rights reserved.
48
49
// generic method testPop pops elements from a Stack
public < T > void testPop( String name, Stack< T > stack )
50
51
52
53
Generic method testPop replaces
testPopDouble and testPopInteger
// pop elements from stack
try
{
54
55
56
[Link]( "\nPopping elements from %s\n", name );
T popValue; // store element removed from stack
57
// remove elements from Stack
58
59
60
while ( true )
{
popValue = [Link](); // pop from stack
61
[Link]( "%s ", popValue );
Replace element type Double/Integer
with type parameter T
62
63
} // end while
} // end try
64
65
catch( EmptyStackException emptyStackException )
{
[Link]();
[Link]();
66
67
68
69
45
} // end catch EmptyStackException
} // end method testPop
70
71
public static void main( String args[] )
72
73
{
StackTest2 application = new StackTest2();
74
[Link]();
75
} // end main
76 } // end class StackTest2
1992-2007 Pearson Education, Inc. All rights reserved.
Pushing elements onto doubleStack
1.1 2.2 3.3 4.4 5.5 6.6
FullStackException: Stack is full, cannot push 6.6
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
46
Popping elements from doubleStack
5.5 4.4 3.3 2.2 1.1
EmptyStackException: Stack is empty, cannot pop
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
Pushing elements onto integerStack
1 2 3 4 5 6 7 8 9 10 11
FullStackException: Stack is full, cannot push 11
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
Popping elements from integerStack
10 9 8 7 6 5 4 3 2 1
EmptyStackException: Stack is empty, cannot pop
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
1992-2007 Pearson Education, Inc. All rights reserved.
47
18.7 Raw Types
Raw type
Enables to instantiate generic class without specifying a
type argument
e.g., Stack objectStack = new Stack( 5 );
objectStack is said to have a raw type
Important for backwards compatibility with prior versions
A raw type Stack variable can be assigned a Stack that
specifies a type argument
A Stack variable that specifies a type argument can be
assigned a raw type Stack
Permitted but unsafe
Use the Xlint:unchecked option to compile
1992-2007 Pearson Education, Inc. All rights reserved.
1
2
3
// Fig. 18.12: [Link]
// Raw type test program.
4
5
public class RawTypeTest
{
48
private Double[] doubleElements = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6 };
7
8
9
private Integer[] integerElements =
{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
10
// method to test Stacks with raw types
11
public void testStacks()
12
13
14
// Stack of raw types assigned to Stack of raw types variable
Stack rawTypeStack1 = new Stack( 5 );
15
16
// Stack< Double > assigned to Stack of raw types variable
17
18
19
20
21
22
23
24
25
26
27
28
29
Instantiate generic class
Stack with raw type
Stack rawTypeStack2 = new Stack< Double >( 5 );
// Stack of raw types assigned to Stack< Integer > variable
Stack< Integer > integerStack = new Stack( 10 );
Assign a Stack< Double >
to variable rawTypeStack2
Assign a Stack of raw type
Stack< Integer >.
); Legal but unsafe
testPush( "rawTypeStack1", rawTypeStack1, doubleElements );
to
testPop( "rawTypeStack1", rawTypeStack1 );
testPush( "rawTypeStack2", rawTypeStack2, doubleElements
testPop( "rawTypeStack2", rawTypeStack2 );
testPush( "integerStack", integerStack, integerElements );
testPop( "integerStack", integerStack );
} // end method testStacks
1992-2007 Pearson Education, Inc. All rights reserved.
30
// generic method pushes elements onto stack
31
public < T > void testPush( String name, Stack< T > stack,
T[] elements )
32
33
34
{
// push elements onto stack
35
try
36
37
{
[Link]( "\nPushing elements onto %s\n", name );
38
39
// push elements onto Stack
40
41
for ( T element : elements )
{
42
43
[Link]( "%s ", element );
[Link]( element ); // push element onto stack
44
45
} // end for
} // end try
46
47
catch ( FullStackException fullStackException )
{
48
49
50
51
49
[Link]();
[Link]();
} // end catch FullStackException
} // end method testPush
52
1992-2007 Pearson Education, Inc. All rights reserved.
53
// generic method testPop pops elements from stack
54
public < T > void testPop( String name, Stack< T > stack )
55
56
57
{
// pop elements from stack
try
{
58
59
60
[Link]( "\nPopping elements from %s\n", name );
T popValue; // store element removed from stack
61
62
63
// remove elements from Stack
while ( true )
{
64
65
66
popValue = [Link](); // pop from stack
[Link]( "%s ", popValue );
} // end while
} // end try
catch( EmptyStackException emptyStackException )
{
67
68
69
70
[Link]();
[Link]();
71
72
} // end catch EmptyStackException
73
74
} // end method testPop
75
76
public static void main( String args[] )
77
78
79
50
{
RawTypeTest application = new RawTypeTest();
[Link]();
80
} // end main
81 } // end class RawTypeTest
1992-2007 Pearson Education, Inc. All rights reserved.
51
Pushing elements onto rawTypeStack1
1.1 2.2 3.3 4.4 5.5 6.6
FullStackException: Stack is full, cannot push 6.6
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
Popping elements from rawTypeStack1
5.5 4.4 3.3 2.2 1.1
EmptyStackException: Stack is empty, cannot pop
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
Pushing elements onto rawTypeStack2
1.1 2.2 3.3 4.4 5.5 6.6
FullStackException: Stack is full, cannot push 6.6
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
1992-2007 Pearson Education, Inc. All rights reserved.
52
Popping elements from rawTypeStack2
5.5 4.4 3.3 2.2 1.1
EmptyStackException: Stack is empty, cannot pop
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
Pushing elements onto integerStack
1 2 3 4 5 6 7 8 9 10 11
FullStackException: Stack is full, cannot push 11
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
Popping elements from integerStack
10 9 8 7 6 5 4 3 2 1
EmptyStackException: Stack is empty, cannot pop
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
at [Link]([Link])
1992-2007 Pearson Education, Inc. All rights reserved.
[Link]: warning: unchecked assignment
found
: Stack
required: Stack<[Link]>
Stack< Integer > integerStack = new Stack( 10 );
^
[Link]: warning: [unchecked] unchecked method invocation:
<T>testPush([Link],Stack<T>,T[]) in RawTypeTest is applied to
([Link],Stack,[Link][])
testPush( "rawTypeStack1", rawTypeStack1, doubleElements );
^
[Link]: warning: [unchecked] unchecked method invocation:
<T>testPop([Link],Stack<T>) in RawTypeTest is applied to
([Link],Stack)
testPop( "rawTypeStack1", rawTypeStack1 );
^
[Link]: warning: [unchecked] unchecked method invocation:
<T>testPush([Link],Stack<T>,T[]) in RawTypeTest is applied to
([Link],Stack,[Link][])
testPush( "rawTypeStack2", rawTypeStack2, doubleElements );
^
[Link]: warning: [unchecked] unchecked method invocation:
<T>testPop([Link],Stack<T>) in RawTypeTest is applied to
([Link],Stack)
testPop( "rawTypeStack2", rawTypeStack2 );
^
5 warnings
53
Fig. 18.13 | Warning message from the compiler.
1992-2007 Pearson Education, Inc. All rights reserved.
54
18.8 Wildcards in Methods That Accept
Type Parameters
Data structure ArrayList
Dynamically resizable, array-like data structure
Method add
Method toString
Motivation for using wildcards
Implement a generic method sum
Total the numbers in a collection
Receive a parameter of type ArrayList< Number >
Use method doubleValue of class Number to obtain the
Numbers underlying primitive value as a double value
1992-2007 Pearson Education, Inc. All rights reserved.
1
2
// Fig. 18.14: [Link]
// Summing the elements of an ArrayList.
3
4
5
import [Link];
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
55
public class TotalNumbers
public static void main( String args[] )
{
// create, initialize and output ArrayList of Numbers
containing
Declare
and initialize
// both Integers and Doubles, then display total of
the numbers
elements
array
Number[] numbers = { 1, 2.4, 3, 4.1 }; // Integers and Doubles
ArrayList< Number > numberList = new ArrayList< Number >();
Declare and initialize numberList,
for ( Number element : numbers )
stores Number objects
[Link]( element ); // place each numberwhich
in numberList
Add elements in numbers array
[Link]( "numberList contains: %s\n", numberList );
to ArrayList numberList
[Link]( "Total of the elements in numberList: %.1f\n",
sum( numberList ) );
} // end main
Invoke method sum to calculate the total
of the elements stored in numberList
1992-2007 Pearson Education, Inc. All rights reserved.
22
// calculate total of ArrayList elements
23
public static double sum( ArrayList< Number > list )
24
25
double total = 0; // initialize total
26
27
// calculate sum
28
for ( Number element : list )
29
56
Method sum accepts an ArrayList
that stores Number objects
total += [Link]();
30
31
return total;
32
} // end method sum
Use method doubleValue of class
Number to obtain the Numbers underlying
primitive value as a double value
33 } // end class TotalNumbers
numberList contains: [1, 2.4, 3, 4.1]
Total of the elements in numberList: 10.5
1992-2007 Pearson Education, Inc. All rights reserved.
57
18.8 Wildcards in Methods That Accept
Type Parameters (Cont.)
Implementing method sum with a wildcard type
argument in its parameter
Number is the superclass of Integer
ArrayList< Number > is not a supertype of
ArrayList< Integer >
Cannot pass ArrayList< Integer > to method sum
Use wildcard to create a more flexible version of sum
ArrayList< ? extends Number >
? Represents an unknown type
Unknown type argument must be either Number or a
subclass of Number
Cannot use wildcard as a type name through method body
1992-2007 Pearson Education, Inc. All rights reserved.
1
2
// Fig. 18.15: [Link]
// Wildcard test program.
3
4
import [Link];
public class WildcardTest
7
8
58
public static void main( String args[] )
{
// create, initialize and output ArrayList of Integers, then
10
11
// display total of the elements
Integer[] integers = { 1, 2, 3, 4, 5 };
12
ArrayList< Integer > integerList = new ArrayList< Integer >();
13
14
// insert elements in integerList
15
for ( Integer element : integers )
16
Declare and create ArrayList
integerList to hold Integers
[Link]( element );
17
18
19
20
[Link]( "integerList contains: %s\n", integerList );
[Link]( "Total of the elements in integerList: %.0f\n\n",
sum( integerList ) );
21
22
// create, initialize and output ArrayList of Doubles, then
23
24
// display total of the elements
Double[] doubles = { 1.1, 3.3, 5.5 };
25
ArrayList< Double > doubleList = new ArrayList< Double >();
26
27
28
// insert elements in doubleList
for ( Double element : doubles )
29
[Link]( element );
Invoke method sum to calculate the total
of the elements stored in integerList
Declare and create ArrayList
doubleList to hold Doubles
30
1992-2007 Pearson Education, Inc. All rights reserved.
31
[Link]( "doubleList contains: %s\n", doubleList );
32
[Link]( "Total of the elements in doubleList: %.1f\n\n",
59
sum( doubleList ) );
33
34
35
36
37
38
// create, initialize and output ArrayList of Numbers containing
of the elements stored in doubleList
// both Integers and Doubles, then display total of the elements
Number[] numbers = { 1, 2.4, 3, 4.1 }; // Integers and Doubles
ArrayList< Number > numberList = new ArrayList< Number >();
39
40
// insert elements in numberList
41
42
for ( Number element : numbers )
[Link]( element );
Invoke method sum to calculate the total
Declare and create ArrayList
integerList to hold Numberss
43
44
45
46
47
48
49
50
51
52
53
[Link]( "numberList contains: %s\n", numberList );
[Link]( "Total of the elements in numberList: %.1f\n",
sum( numberList ) );
} // end main
Invoke method sum to calculate
the total
of the elements stored in numberList
// calculate total of stack elements
public static double sum( ArrayList< ? extends Number > list )
{
The ArrayList
double total = 0; // initialize total
arguments element types
are not directly known by the method, they
are known to be at least of type Number
1992-2007 Pearson Education, Inc. All rights reserved.
54
// calculate sum
55
for ( Number element : list )
56
60
total += [Link]();
57
58
return total;
59
} // end method sum
60 } // end class WildcardTest
integerList contains: [1, 2, 3, 4, 5]
Total of the elements in integerList: 15
doubleList contains: [1.1, 3.3, 5.5]
Total of the elements in doubleList: 9.9
numberList contains: [1, 2.4, 3, 4.1]
Total of the elements in numberList: 10.5
1992-2007 Pearson Education, Inc. All rights reserved.
61
Common Programming Error 18.4
Using a wildcard in a methods type parameter
section or using a wildcard as an explicit type of a
variable in the method body is a syntax error.
1992-2007 Pearson Education, Inc. All rights reserved.
62
18.9 Generics and Inheritance: Notes
Inheritance in generics
Generic class can be derived from non-generic class
e.g., class Object is superclass of every generic class
Generic class can be derived from another generic class
e.g., Stack is a subclass of Vector
Non-generic class can be derived from generic class
e.g., Properties is a subclass of Hashtable
Generic method in subclass can override generic method in
superclass
If both methods have the same signature
1992-2007 Pearson Education, Inc. All rights reserved.