1 L39 Generics (1). 2 OBJECTIVES To create generic methods that perform identical tasks on...

21
1 L3 9 Generics (1)
  • date post

    21-Dec-2015
  • Category

    Documents

  • view

    214
  • download

    0

Transcript of 1 L39 Generics (1). 2 OBJECTIVES To create generic methods that perform identical tasks on...

Page 1: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

1

L39

L39

Generics (1)

Page 2: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

2

OBJECTIVES

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.

Page 3: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

3

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

Page 4: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

4

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

Page 5: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

5

Outline

OverloadedMethods.java

(1 of 3)

Line 7

Line 17

1 // Fig. 18.1: OverloadedMethods.java

2 // Using overloaded methods to print array of different types.

3

4 public class OverloadedMethods

5 {

6 // method printArray to print Integer array

7 public static void printArray( Integer[] inputArray )

8 {

9 // display array elements

10 for ( Integer element : inputArray )

11 System.out.printf( "%s ", element );

12

13 System.out.println();

14 } // end method printArray

15

16 // method printArray to print Double array

17 public static void printArray( Double[] inputArray )

18 {

19 // display array elements

20 for ( Double element : inputArray )

21 System.out.printf( "%s ", element );

22

23 System.out.println();

24 } // end method printArray

25

Method printArray accepts an array of Integer objects

Method printArray accepts an array of Double objects

Page 6: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

6

Outline

OverloadedMethods.java

(2 of 3)

Line 27

26 // method printArray to print Character array

27 public static void printArray( Character[] inputArray )

28 {

29 // display array elements

30 for ( Character element : inputArray )

31 System.out.printf( "%s ", element );

32

33 System.out.println();

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

Method printArray accepts an array of Character objects

Page 7: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

7

Outline

OverloadedMethods.java

(3 of 3)

Line 44

Line 46

Line 48

Program output

43 System.out.println( "Array integerArray contains:" );

44 printArray( integerArray ); // pass an Integer array

45 System.out.println( "\nArray doubleArray contains:" );

46 printArray( doubleArray ); // pass a Double array

47 System.out.println( "\nArray characterArray contains:" );

48 printArray( characterArray ); // pass a Character array

49 } // 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 integerArray’s type (i.e., Integer[]), attempts to locate a method named printArray that specifies a single Integer[] parameter (lines 7-14)

At compile time, the compiler determines argument doubleArray’s 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 characterArray’s type (i.e., Character[]), attempts to locate a method named printArray that specifies a single Character[] parameter (lines 7-14)

Page 8: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

8

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

Page 9: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

9

Outline 1 public static void printArray( E[] inputArray )

2 {

3 // display array elements

4 for ( E element : inputArray )

5 System.out.printf( "%s ", element );

6

7 System.out.println();

8 } // end method printArray

Fig. 18.2 | printArray method in which actual type names are replaced by convention with the generic name E.

Replace the element type with a single generic type E

Replace the element type with a single generic type E

Page 10: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

10

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 method’s return type

• Contain one or more type parameters

– Also called formal type paramters

Page 11: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

11

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 )

Page 12: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

12

Outline

GenericMethodTest.java

(1 of 2)

Line 7

Line 7

Lines 10

1 // Fig. 18.3: GenericMethodTest.java

2 // Using generic methods to print array of different types.

3

4 public class GenericMethodTest

5 {

6 // generic method printArray

7 public static < E > void printArray( E[] inputArray )

8 {

9 // display array elements

10 for ( E element : inputArray )

11 System.out.printf( "%s ", element );

12

13 System.out.println();

14 } // end method printArray

15

16 public static void main( String args[] )

17 {

18 // create arrays of Integer, Double and Character

19 Integer[] intArray = { 1, 2, 3, 4, 5 };

20 Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7 };

21 Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };

22

Type parameter section delimited by angle brackets (< and > )

Use the type parameter to declare method printArray’s parameter type

Use the type parameter to declare method printArray’s local variable type

Page 13: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

13

Outline

GenericMethodTest.java

(2 of 2)

Line 24

Line 26

Line 28

Program output

23 System.out.println( "Array integerArray contains:" );

24 printArray( integerArray ); // pass an Integer array

25 System.out.println( "\nArray doubleArray contains:" );

26 printArray( doubleArray ); // pass a Double array

27 System.out.println( "\nArray characterArray contains:" );

28 printArray( characterArray ); // pass a Character array

29 } // end main

30 } // end class GenericMethodTest 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

Invoke generic method printArray with an Integer array

Invoke generic method printArray with a Double array

Invoke generic method printArray with a Character array

Page 14: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

14

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

Page 15: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

15

Outline 1 public static void printArray( Object[] inputArray )

2 {

3 // display array elements

4 for ( Object element : inputArray )

5 System.out.printf( "%s ", element );

6

7 System.out.println();

8 } // end method printArray

Fig. 18.4 | Generic method printArray after erasure is performed by the compiler.

Remove type parameter section and replace type parameter with actual type Object

Replace type parameter with actual type Object

Page 16: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

1618.4 Additional Compile-Time Translation Issues: Methods That Use a Type Parameter as the Return Type

• 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 integer1.compareTo( 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

Page 17: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

17

Outline

MaximumTest.java

(1 of 2)

Line 7

Line 7

Line 9

Line 11-12

Lines 14-15

1 // Fig. 18.5: MaximumTest.java

2 // Generic method maximum returns the largest of three objects.

3

4 public class MaximumTest

5 {

6 // determines the largest of three Comparable objects

7 public static < T extends Comparable< T > > T maximum( T x, T y, T z )

8 {

9 T max = x; // assume x is initially the largest

10

11 if ( y.compareTo( max ) > 0 )

12 max = y; // y is the largest so far

13

14 if ( z.compareTo( max ) > 0 )

15 max = z; // z is the largest

16

17 return max; // returns the largest object

18 } // end method maximum

19

Type parameter section specifies that only object of classes that implement interface Comparable can be used with this method

Type parameter is used in the return type of method maximum

Invokes method compareTo method Comparable to compare y and max

Invokes method compareTo method Comparable to compare z and max

Assign x to local variable max

Page 18: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

18

Outline

MaximumTest.java

(2 of 2)

Line 23

Line 25

Line 27

Program output

20 public static void main( String args[] )

21 {

22 System.out.printf( "Maximum of %d, %d and %d is %d\n\n", 3, 4, 5,

23 maximum( 3, 4, 5 ) );

24 System.out.printf( "Maximum of %.1f, %.1f and %.1f is %.1f\n\n",

25 6.6, 8.8, 7.7, maximum( 6.6, 8.8, 7.7 ) );

26 System.out.printf( "Maximum of %s, %s and %s is %s\n", "pear",

27 "apple", "orange", maximum( "pear", "apple", "orange" ) );

28 } // end main 29 } // end class MaximumTest

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

Invoke generic method maximum with three integers

Invoke generic method maximum with three doubles

Invoke generic method maximum with three strings

Page 19: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

1918.4 Additional Compile-Time Translation Issues: Methods That Use a Type Parameter as the Return Type (Cont.)

• 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 )

Page 20: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

20

Outline 1 public static Comparable maximum(Comparable x, Comparable y, Comparable z)

2 {

3 Comparable max = x; // assume x is initially the largest

4

5 if ( y.compareTo( max ) > 0 )

6 max = y; // y is the largest so far

7

8 if ( z.compareTo( max ) > 0 )

9 max = z; // z is the largest

10

11 return max; // returns the largest object

12 } // end method maximum

Erasure replaces type parameter T with its upper bound Comparable

Erasure replaces type parameter T with its upper bound Comparable

Page 21: 1 L39 Generics (1). 2 OBJECTIVES  To create generic methods that perform identical tasks on arguments of different types.  To create a generic Stack.

21

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