36
LECTURE 14: GENERIC TYPES

Generic Types Recent release of Java added generics Include type parameters in class definition Like methods, parameters can change each time

Embed Size (px)

Citation preview

Page 1: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

LECTURE 14:GENERIC TYPES

Page 2: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Generic Types

Recent release of Java added generics Include type parameters in class

definition Like methods, parameters can change each

time Fields independent of types can now be

written

Page 3: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Generic Types

On allocating instance, actual type is specified Must be reference type or String as actual

type Code runs as if were written using that type Type used by instance cannot be changed Type parameter becomes part of variable’s

type

Page 4: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Generics Before & After

Before Generics After Generics

public class ONode {private Object data;ONode(Object d) { data = d;}Object getData() { return data;}void setData(Object d){ data = d;}

}

public class Node<T> {private T data;public Node(T d) { data = d;}T getData() { return data;}void setData(T d){ data = d;}

}

Page 5: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Writing Generics

public class Bag<T, String> {private T data;private String name;

public Bag(T d, String newName) { data = d; name = newName;}

public T getData() { return data; }

public void setData(T d){ data = d; }

public String toString() { return name + “: ” + data.toString();}

}

Page 6: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

public class Bag<T, String> {private T data;private String name;

public Bag(T d, String newName) { data = d; name = newName;}

public T getData() { return data; }

public void setData(T d){ data = d; }

public String toString() { return name + “: ” + data.toString();}

}

Writing Generics

Page 7: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

public class Bag<T, String> {private T data;private String name;

public Bag(T d, String newName) { data = d; name = newName;}

public T getData() { return data; }

public void setData(T d){ data = d; }

public String toString() { return name + “: ” + data.toString();}

}

Writing Generics

Page 8: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

public class Bag<T> {private T data;private String name;

public Bag(T d, String newName) { data = d; name = newName;}

public T getData() { return data; }

public void setData(T d){ data = d; }

public String toString() { return name + “: ” + data.toString();}

}

Writing Generics

Page 9: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Bag<Integer> earth = new Bag<Integer>(4, “The Answer”);

public class Bag<T> {private T data;private String name;

public Bag(T d, String newName) { data = d; name = newName;}

public T getData() { return data; }

public void setData(T d){ data = d; }

public String toString() { return name + “: ” + data.toString();}

}

See Generics Behave

Page 10: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Bag<Integer> earth = new Bag<Integer>(4, “The Answer”);

public class Bag {private Integer data;private String name;

public Bag(Integer d, String newName) { data = d; name = newName;}

public Integer getData() { return data; }

public void setData(Integer d){ data = d; }

public String toString() { return name + “: ” + data.toString();}

}

See Generics Behave

For earth, class written like as if T were replaced by Integer

Page 11: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Bag<Car> matchbox = new Bag<Car>(Z4, “Dream”);

public class Bag<T> {private T data;private String name;

public Bag(T d, String newName) { data = d; name = newName;}

public T getData() { return data; }

public void setData(T d){ data = d; }

public String toString() { return name + “: ” + data.toString();}

}

See Generics Behave

Page 12: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Bag<Car> matchbox = new Bag<Car>(Z4, “Dream”);

public class Bag {private Car data;private String name;

public Bag(Car d, String newName) { data = d; name = newName;}

public Car getData() { return data; }

public void setData(Car d){ data = d; }

public String toString() { return name + “: ” + data.toString();}

}

See Generics Behave

For matchbox, T is Car at same time it is Integer when using earth

Page 13: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Using Generics

Without Generics With GenericsInteger i;Car c;Bag n;

...

n = new Bag(5,“B”);i = ((Integer)n.getData());c = ((Car)n.getData());

n.setData(c);

i = ((Integer)n.getData()); c = ((Car)n.getData());

Integer i;Car c;Bag<Integer> n;Bag<Car> m;

...

n = new Bag<Integer>(5,“B”);i = n.getData();c = n.getData();

n.setData(s);m = new Bag<Car>(c, “B”);

i = m.getData();c = m.getData();

Page 14: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Using Generics

Without Generics With GenericsInteger i;Car c;Bag n;

...

n = new Bag(5,“B”);i = ((Integer)n.getData());c = ((Car)n.getData());

n.setData(c);

i = ((Integer)n.getData()); c = ((Car)n.getData());

Integer i;Car c;Bag<Integer> n;Bag<Car> m;

...

n = new Bag<Integer>(5,“B”);i = n.getData();c = n.getData();

n.setData(s);m = new Bag<Car>(c, “B”);

i = m.getData();c = m.getData();

Page 15: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Using Generics

Without Generics With GenericsInteger i;Car c;Bag n;

...

n = new Bag(5,“B”);i = ((Integer)n.getData());c = ((Car)n.getData());

n.setData(c);

i = ((Integer)n.getData()); c = ((Car)n.getData());

Integer i;Car c;Bag<Integer> n;Bag<Car> m;

...

n = new Bag<Integer>(5,“B”);i = n.getData();c = n.getData();

n.setData(s);m = new Bag<Car>(c, “B”);

i = m.getData();c = m.getData();

Page 16: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Using Generics

Without Generics With GenericsInteger i;Car c;Bag n;

...

n = new Bag(5,“B”);i = ((Integer)n.getData());c = ((Car)n.getData());

n.setData(c);

i = ((Integer)n.getData()); c = ((Car)n.getData());

Integer i;Car c;Bag<Integer> n;Bag<Car> m;

...

n = new Bag<Integer>(5,“B”);i = n.getData();c = n.getData();

n.setData(c);m = new Bag<Car>(c, “B”);

i = m.getData();c = m.getData();

Page 17: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

public class Entry<S, TYPE> { private S key; private TYPE value; // And more goes here...

}Entry<String, Integer> a;Entry<String> b;Entry<String, String> c;Entry<String, boolean> d;Entry<Car, Boolean> e;

Can Use Multiple Generic Types

Page 18: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

public class Entry<S, TYPE> { private S key; private TYPE value; // And more goes here...

}Entry<String, Integer> a;Entry<String> b; Did not specify for each type

Entry<String, String> c;Entry<String, boolean> d;Entry<Car, Boolean> e;

Can Use Multiple Generic Types

Page 19: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

public class Entry<S, TYPE> { private S key; private TYPE value; // And more goes here...

}Entry<String, Integer> a;Entry<String> b; Did not specify for each type

Entry<String, String> c;Entry<String, boolean> d; Not reference type

Entry<Car, Boolean> e;

Can Use Multiple Generic Types

Page 20: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

When To Specify Type

Whenever class name used (except constructors) Variable declarations:ArrayList<Integer> hogCount;

Object instantiation:hogCount = new ArrayList<Double>();

Return type for method :private ArrayList<Pig> transport()

Parameter listing:public void cook(ArrayList<Meat> fd)

Used as type parameter:ArrayList<ArrayList<Meat>> bacon;

Page 21: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Type cannot be specified instantiating array Compiler error if type specified during

instantiation Can provide type theory explaining this

problem

Generics Annoyance

Page 22: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Type cannot be specified instantiating array

Can use generics with arrays, but need typecast Only needed once, use generics after instantiation Still checks when compiling, so get most benefits

public class Farm<T> { private ArrayList<Feed>[] troughs; private T[] animals; public Farm() { troughs = (ArrayList<Feed>[])new ArrayList[10]; animals = (T[])new Object[1034821]; }}

Generics Annoyance

Page 23: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Single method or class may not care about type Different than using typecasts to get to

work Only will work if does not need to

instantiate object Do not skip specifying type -- that is BAD

IDEA™ Instead use the generic wildcard ?

In Case of Unknown Type

Page 24: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Single method or class may not care about type Different than using typecasts to get to

work Only will work if does not need to

instantiate object Do not skip specifying type -- that is BAD

IDEA™ Instead use the generic wildcard ?

In Case of Unknown Type

Page 25: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Wildcard in Generic

public class ListHolder {private ArrayList<?> myList; public void setList(ArrayList<?> lst){

myList = lst;}

public void printListSize() {System.out.println(myList.size());

}

public ArrayList<?> getList() {return myList;

}}

Page 26: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Wildcard in Generic

public class ListHolder {private ArrayList<?> myList; public void setList(ArrayList<?> lst){

myList = lst;}

public void printListSize() {System.out.println(myList.size());

}

public ArrayList<?> getList() {return myList;

}}

? matches any reference type(and String)

Page 27: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Wildcard in Generic

public class ListHolder {private ArrayList<?> myList; public void setList(ArrayList<?> lst){

myList = lst;}

public void printListSize() {System.out.println(myList.size());

}

public ArrayList<?> getList() {return myList;

}}

Any ArrayList can be passed in for lst

Page 28: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Wildcard in Generic

public class ListHolder {private ArrayList<?> myList; public void setList(ArrayList<?> lst){

myList = lst;}

public void printListSize() {System.out.println(myList.size());

}

public ArrayList<?> getList() {return myList;

}}

Can call methods as long asmissing type not important

Page 29: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Wildcard in Generic

public class ListHolder {private ArrayList<?> myList; public void setList(ArrayList<?> lst){

myList = lst;}

public void printListSize() {System.out.println(myList.size());

}

public ArrayList<?> getList() {return myList;

}}

Legal, but yucky. All type information is lost!

Page 30: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Typecasting Explained

Page 31: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Typecasting Explained

Page 32: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

99% of typecasts are incorrect 90% fix missing generic type specification

on variable Eclipse “Quick-Fix” on illegal code is 9% 0.95% instantiate arrays of generic type When using interfaces in an ADT is 0.05%

Typecasting Explained

Page 33: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

Your Turn

Get into your groups and complete activity

Page 34: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

For Monday

You can use on this midterm: Your textbook & notes Printout of slides IF has notes on that day's

slides At the same time, you may NOT use:

Computer, calculator, cell phone, or similar Copies of daily activities and/or solutions Friends, Romans, countrymen or their ears

To be certain rules are followed, when test ends Hand in all printed material you had with

you

Page 35: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

How to Prepare for Monday

DO DON'T

Make cheat sheets for the test

Review how parts of Java work

Add post-its to important pages

Memorize Drink case of 40s before

test Use post-its as clothing

Page 36: Generic Types  Recent release of Java added generics  Include type parameters in class definition  Like methods, parameters can change each time

For Next Lecture

Midterm #1 is on Monday Study, study, study Get your notes in order