generic(parameterized ) types mehdi einali advanced programming in java 1

51
Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

Upload: sharleen-chapman

Post on 19-Jan-2016

222 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

1

Generic(Parameterized ) types

Mehdi Einali

Advanced Programming in Java

Page 2: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

2

AgendaWhy Generics

Generic MethodsGeneric Classes

Type ErasureGenerics and InheritanceGenerics and Wild CardsRestrictions on Generics

Page 3: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

3

Why generics

Page 4: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

4

Page 5: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

5

Stack interfacesinterface StringStack{

void push(String s);String pop();

}interface IntegerStack{

void push(Integer s);Integer pop();

}interface StudentStack{...

Page 6: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

6

Sort Methodstatic void sort(Integer[] array) {// ...

}static void sort(Double[] array) {// ...

}static void sort(String[] array) {// ...

}static void sort(Student[] array){// ...

}

Page 7: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

7

The ProblemWhat is wrong with these examples?

Code redundancy No effective code reuse

Solution?Using Object classPros and Cons?

Compile-time type safety

Page 8: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

8

Most of time Common properties and controls requiredBut software is not just execution of code developers is very important

Annotations: @Deprecated, @Override, @AuthorWe need some type check just for compile time(for humans not computers)

Compile time vs runtime time

Compile Runtime

Page 9: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

9

The SolutionGeneric types and methods

Methods with similar implementation which accepts parameters for impose some restriction on them

Generics provides abstraction over Types (Parameterized Types)

Page 10: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

10

Generic stackStack<Havij> stack=new Stack<Havij>();Stack.push(new Havij());Stack.push(new Havij());

Stack<Golabi> stack=new Stack<Golabi>();Stack.push(new Golabi());Stack.push(new Golabi());

Page 11: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

11

Why generics?To enable a compiler to as much as error as it can at compile time rather than getting surprised at run time(ClassCastException)

Extended code reusability

Improve readability and robustness

Try to find bugs ASAP!!

Page 12: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

12

Generic classes

Page 13: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

13

Type parameter as the Return Type

interface Stack<T>{void push(T s);T pop();

}

Stack<String> stringStack = new ...stringStack.push(“salam”);String s = stringStack.pop();

Page 14: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

14

public class Stack<E > {private E[] elements ;private final int size; // number of elements in the

stackprivate int top; // location of the top elementpublic void push(E pushValue) {

if (top == size - 1) // if stack is full throw new FullStackException();

elements[++top] = pushValue; }

public E pop() {if (top == -1) // if stack is empty

throw new EmptyStackException();return elements[top--];

}public Stack() {

size = 10; top = -1; elements = new Object[size];

}}

Page 15: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

15

Using Stack Class Stack<String> stack1 = new Stack<String>();stack1.push("first");stack1.push("second");System.out.println(stack1.pop());System.out.println(stack1.pop());

Stack<Integer> stack2 = new Stack<Integer>();stack2.push(1);stack2.push(2);System.out.println(stack2.pop());System.out.println(stack2.pop());

Page 16: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

16

Compile-time Type CheckingStack<String> stack1 = new Stack<String>();

stack1.push(new Integer(2));

Compile-time error

Page 17: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

17

public class Stack<E extends Student> {private E[] elements ;private final int size; // number of elements in the

stackprivate int top; // location of the top element

public void push(E pushValue) {if (top == size - 1) // if stack is full

throw new FullStackException();elements[++top] = pushValue;

} public E pop() {

if (top == -1) // if stack is emptythrow new EmptyStackException();

return elements[top--]; }public Stack() {

size = 10; top = -1; elements = new Student[size];

}}

Page 18: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

18

Generic methods

Page 19: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

19

Generic MethodsDeclaring a method which accepts different parameter types

For each method invocation, the compiler searches the appropriate methodIf the compiler does not find a method, it looks for a compatible generic method

Type Parameter

It says: In this method, E is not a regular type, it is a generic one

Page 20: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

20

printArray() Generic Method

Page 21: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

21

Benefits of Genericspublic static < E extends Number> void printArray( E[] inputArray ){…}

Restricting possible typesCompile-time type checking

printArray(stringArray) bringsCompiler Erroror exception?

Page 22: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

22

You can specify generic type for methods too.

Page 23: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

23

Type erasure

Page 24: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

24

Raw TypesGeneric classes and methods can be used without type parameterStack<String> s = new Stack<String>();

String as type parameters.push(“salam”);s.push(new Integer(12)); Compiler Error

Stack objectStack = new Stack(); no type parameters.push(“salam”);s.push(new Integer(12));s.push(new Student(“Ali Alavi”));

Page 25: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

25

No Generics in RuntimeGenerics is a compile-time aspectIn runtime, there is no generic informationAll generic classes and methods are translated with raw typesByte code has no information about genericsOnly raw types in byte codeThis mechanism is named generic type erasure

Page 26: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

26

ErasureWhen the compiler translates generic method into Java bytecodesIt removes the type parameter section It replaces the type parameters with actual types.This process is known as erasure

Page 27: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

27

Erasure Example (1)class Stack<T>{

void push(T s){...}T pop() {...}

}

Is translated to

class Stack {void push(Object s){...}Object pop() {...}

}

Page 28: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

28

Erasure Example (2)

Translated to

Page 29: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

29

What Happens if…

Page 30: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

30

Some NotesWe can also create generic interfaces

interface Stack<T>{void push(T s);T pop();

}

Page 31: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

31

What Happens if…public static <E extends Number> void f(E i){

}

public static void f(Number i){}

Compiler Error : Method f(Number) has the same erasure version f(Number) as another method in this

type

Page 32: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

32

Multiple Type Parametersclass MultipleType<T,K>{

private T t;public T getT() {

return t;}public void setT(T t) {

this.t = t;}public void doSomthing(K k, T t){…}

}MultipleType<String, Integer> multiple =

new MultipleType<String, Integer>();multiple.doSomthing(5, "123");

Page 33: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

33

Inheritance and generics

Page 34: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

34

Generics and subtypesYou can do this

Object o = new Integer(5);

You can even do thisObject[] or = new Integer[5];

So you would expect to be able to do thisArrayList<Object> ao = new ArrayList<Integer>();This is counter-intuitive at the first glance

Page 35: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

35

Why?

So there is no inheritance relationship between typearguments of a generic class

Page 36: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

36

This works

Inheritance relationship between genericclasses themselves still exists

Page 37: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

37

Still works

Entries in a collection maintain inheritancerelationship

Page 38: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

38

Generics and InheritanceA non-generic class can be inherited by a non-generic class

As we saw before learning generics

A generic class can be inherited from a non-generic class

Adding generality to classes

A non-generic class can be inherited from a generic class

Removing generality

A generic class can be inherited by a generic class

Page 39: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

39

class GenericList<T> extends Object{public void add(T t){...}public T get(int i) {...}public void remove(int i) {...}

}class GenericNumericList<T extends Number>

extends GenericList<T>{}

class NonZeroIntegerList extends GenericList<Integer>{

public void add(Integer t) { if(t==null || t==0)

throw new RuntimeException(“Bad value"); super.add(t); }

}

Page 40: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

40

Generics and Wild card

Page 41: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

41

Why Wildcards? ProblemConsider the problem of writing a routine that prints out all the elements in a collection

What is wrong with this?

Page 42: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

42

Why Wildcards? SolutionUse Wildcard type argument <?>Collection<?> means Collection of unknown type

Page 43: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

43

Bounded wild characterIf you want to bound the unknown type to be a subtype of another type, use bounded Wildcard

Page 44: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

44

Restrictions on generic types

Page 45: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

45

Not primitive type

Cannot Instantiate Generic Types with Primitive Types

Page 46: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

46

Not insatiateCannot Create Instances of Type Parameters

Page 47: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

47

Not staticCannot Declare Static Fields Whose Types are Type Parameters

Confusing code:

Page 48: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

48

No cast no instaneofCannot Use Casts or instanceof with Parameterized Types

The runtime does not keep track of type parameters, so it cannot tell the difference between an ArrayList<Integer> and an ArrayList<String>.

Page 49: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

49

Arrays of Parameterized Types

You cannot create arrays of parameterized type

Page 50: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

50

Generics and Java 7Older versions:

ArrayList<String> list = new ArrayList<String>();

With Java 7:ArrayList<String> list = new ArrayList<>();

Type information after new are ignored.

List<Map<Long, Set<Integer>>> list = new ArrayList<>();

Page 51: Generic(Parameterized ) types Mehdi Einali Advanced Programming in Java 1

51

end