Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java...

14
CS6202 Java Generics 1 CS6202: Advanced Topics in Programming Languages and Systems Lecture 10/11 : Java Generics and Collections • Overview • Subtyping and Wildcard • Comparison and Bounds • Declaration and Erasure • Reification and Reflection • Collections • Iterator, Iterable, Collection • Set, Queues, List, Maps • Design Patterns • Other Issues CS6202 Java Generics 2 Motiva tion Motiva tion Generics is important for: software reuse type safety optimization (fewer castings) Important Principle : “Everything should be as simple as possible but no simpler” CS6202 Java Generics 3 Ja va 5 Ja va 5 Some features in new language boxing/unboxing new form of loop functions with variable number of arguments generics more concurrency features CS6202 Java Generics 4 Java 5 : Example Java 5 : Example generic collection unboxing/boxing new loop function with variable number of arguments assert from Java 1.4

Transcript of Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java...

Page 1: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 1

CS6202: Advanced Topics in Programming Languagesand Systems

Lecture 10/11 : Java Generics and Collections

• Overview• Subtyping and Wildcard• Comparison and Bounds• Declaration and Erasure• Reification and Reflection• Collections

• Iterator, Iterable, Collection• Set, Queues, List, Maps

• Design Patterns• Other Issues

CS6202 Java Generics 2

MotivationMotivation

Generics is important for:

software reuse

type safety

optimization (fewer castings)

Important Principle :

“Everything should be as simple as possible but no simpler”

CS6202 Java Generics 3

Java 5Java 5

Some features in new language

boxing/unboxing

new form of loop

functions with variable number of arguments

generics

more concurrency features

CS6202 Java Generics 4

Java 5 : ExampleJava 5 : Example

generic collectionunboxing/boxing

newloop

function with variablenumber of argumentsassert from Java 1.4

Page 2: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 5

Example in Java 1.4Example in Java 1.4

similar code with Array in Java 1.4

CS6202 Java Generics 6

Generics by ErasureGenerics by Erasure

Java Generics is implemented by erasure:- simplicity- small- eases evolution (compatibility)

List<Integer>, List<String>, List<List<String>>

erases to just List

Anomaly : array type very different from parametric type.new String[size]new ArrayList<String>()

with the latter losing info on element type.

CS6202 Java Generics 7

Boxing andBoxing and UnboxingUnboxing

Unboxed types can give better performance

Boxed type may be cached for frequent values.

60% slower

CS6202 Java Generics 8

ForeachForeach LoopLoop

Works with iterator and is more concise.Kept simple – cannot use remove + multiple lists.

compiles to

Page 3: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 9

Iterator/ IterableIterator/ Iterable InterfacesInterfaces

Iterator supports iteration through a collection.

Iterable allows an Iterator object to be build.

CS6202 Java Generics 10

Methods withMethods with VarargsVarargs

Packing argument for array is cumbersome.

Arrays can be used to accept a list of elements.

CS6202 Java Generics 11

Methods withMethods with VarargsVarargs

Syntactic sugar to support Varargs. varargs

The above is compiled to use array.

CS6202 Java Generics 12

Outline

• Overview• Subtyping and Wildcard• Comparison and Bounds• Declaration and Erasure• Reification and Reflection• Collections

• Iterator, Iterable, Collection• Set, Queues, List, Maps

• Design Patterns• Other Issues

Page 4: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 13

SubtypingSubtyping and Substitutions Principleand Substitutions Principle

Subtyping Principle :A variable of a given type may be assigned a value of anysubtype of that type. The same applies to arguments.

However, it is not sound to have:List<Integer> <: List<Number>

But arrays may be covariant:Integer[] <: Number[]

CS6202 Java Generics 14

Covariant andCovariant and ContravariantContravariant SubtypingSubtyping

Covariant Subtyping :List<Integer> <: List<? extends Number>

list of elements of any type that is a subtype of Number

Contravariant Subtyping :List<Number> <: List<? super Integer>

list of elements of any type that is a supertype of Number

Get and Put Principle : use an extends wildcard when youonly get values out of a structure, use a super wildcardwhen you put values into a structure. Don’t use wildcardwhen you both get and put.

CS6202 Java Generics 15

ExampleExample

Copy from one list to another :

Getting elements :

CS6202 Java Generics 16

ExampleExample

Putting elements :

Two Bounds? Not legal though plausible.

Page 5: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 17

ArraysArrays

Array subtyping is covariant.

This was designed before generics.

Seems irrelevant now :- unsound as it relies on runtime checks- incompatible with Collection

- should perhaps deprecate over time.

One Solution : Use more of Collection rather than Array

- more flexibility- more features/operations- better generics

CS6202 Java Generics 18

WildcardWildcard vsvs Type ParameterType Parameter

Wildcards may be used if only Objects are being read. Collection<?> also stands for Collection<? extends Object>

Alternative (more restrictive but safer).

CS6202 Java Generics 19

Wildcard CaptureWildcard Capture

We can reverse a list using parametric type or wildcard type?

CS6202 Java Generics 20

Wildcard CaptureWildcard Capture

Solution is to use a wrapper function with wildcard capture :

This solution is similar to a open/close capture of anexistential type.

Page 6: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 21

Restriction on WildcardsRestriction on Wildcards

Wildcards should not appear at(i) top-level of class instance creation(ii) explicit type parameters of generic method(iii) in supertypes of extends/implements

CS6202 Java Generics 22

Restriction on WildcardsRestriction on Wildcards

Restriction on supertype of extends/implements

Restriction on explicit parameter of methods

permitted

CS6202 Java Generics 23

Outline

• Overview• Subtyping and Wildcard• Comparison and Bounds• Declaration and Erasure• Reification and Reflection• Collections

• Iterator, Iterable, Collection• Set, Queues, List, Maps

• Design Patterns• Other Issues

CS6202 Java Generics 24

Comparison and BoundsComparison and Boundsx.compareTo(y) method is based on natural ordering

x less_than y returns a negative valuex equal_to y returns zerox more_than y returns a positive value

Consistency with equalx.equals(y) if and only if x.compareTo(y)==0

Main difference with null

x.equals(null) returns falsex.compareTo(null) throws an exception

Page 7: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 25

Contract for ComparableContract for Comparable

Anti-symmetric :sgn(x.compareTo(y)) == -sgn(y.compareTo(x))

Transitivity :if x.compareTo(y)<0 and y.compareTo(z)<0then x.compareTo(z)<0

Congruence :if x.compareTo(y)==0 then

forall z. sgn(x.compareTo(z)==sgn(x.compareTo(z))

CS6202 Java Generics 26

Implementing Integer as ComparableImplementing Integer as Comparable

Correct way :

Incorrect way - overflow problem :

CS6202 Java Generics 27

Maximum of a CollectionMaximum of a Collection

Generic code to find maximum :

A more general signature is based on get/put principle:

need to comparewith its own type

CS6202 Java Generics 28

Fruity ExampleFruity Example

There is some control over what can be compared.

cannot compare apple with orange

can now compare between orange/apple

Page 8: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 29

Fruity ExampleFruity Example

Recall :

This works for List<Orange> and List<Fruit>, but oldversion works for only List<Fruit> .

CS6202 Java Generics 30

ComparatorComparator

Allows additional ad-hoc ordering to be specified :

Example : shorter string is smaller

CS6202 Java Generics 31

ComparatorComparator

Implement max using Comparator :

Comparator from natural order :

CS6202 Java Generics 32

Enumerated TypesEnumerated Types

Enumerated type corresponds to a class with a set of final staticvalues. First, an abstract class :

compare within sameenumerated type only

Page 9: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 33

Enumerated TypeEnumerated Type

An instance of enumerated type.

CS6202 Java Generics 34

Covariant OverridingCovariant Overriding

Java 5 can override another if arguments match exactly but theresult of overriding method is a subtype of other method.

Useful for clone method :class Object {

:public Object clone() { … }

}

class Point {:

public Point clone() { return new Point(x,y);}}

covariant overriding

CS6202 Java Generics 35

Outline

• Overview• Subtyping and Wildcard• Comparison and Bounds• Declaration and Erasure• Reification and Reflection• Collections

• Iterator, Iterable, Collection• Set, Queues, List, Maps

• Design Patterns• Other Issues

CS6202 Java Generics 36

ConstructorsConstructors

Actual type parameters should be provided :

Pair<String,Integer> p = newPair<String,Integer>(“one”,2)

Pair<String,Integer> p = new Pair(“one”,2)

If you forget, it is a raw type with unchecked warning :

Page 10: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 37

Static MembersStatic Members

Static methods are independent of any type parameters :

Cell.getCount() // ok

Cell<Integer>.getCount() // compile-time error

Cell<?>.getCount() // compile-time error

CS6202 Java Generics 38

How Erasure WorksHow Erasure Works

CS6202 Java Generics 39

Outline

• Overview• Subtyping and Wildcard• Comparison and Bounds• Declaration and Erasure• Reification and Reflection• Collections

• Iterator, Iterable, Collection• Set, Queues, List, Maps

• Design Patterns• Other Issues

CS6202 Java Generics 40

ReificationReification

Refers to an ability to get run-time type information.This is a kind of concretization.

Number[] has reified type Number[]

ArrayList<Number> has reified type ArrayList

Array is reified with its component type, butparameterized types is reified without its component type.

Page 11: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 41

Reified TypesReified TypesType that is reifiable.

Type that is not reifiable.

CS6202 Java Generics 42

ReificationReification

An incorrect code to convert a collection to an array.

not reifiable

CS6202 Java Generics 43

ReificationReification -- ArraysArrays

More problem :

CS6202 Java Generics 44

ReificationReification -- ArraysArrays

More problem :

Page 12: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 45

ReificationReification -- ArraysArrays

Alternative using another array + reflection!

CS6202 Java Generics 46

ReificationReification -- ArraysArrays

Solution using a Class – runtime type!

CS6202 Java Generics 47

ReflectionReflection

Reflection is a term to allow a program to examine its owndefinition.

Generics for reflection supports the process using new genericprogramming techniques.

Reflection for generics allow generic types (e.g. type vars,wildcard types) to be captured at runtime.

CS6202 Java Generics 48

Generics for ReflectionGenerics for Reflection

A new generic type for Class

Page 13: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 49

Reflection for Primitive TypeReflection for Primitive Type

We cannot use Class<int> as type parameter must be referencetype. Use Class<Integer> for int.class instead!

Java.lang.reflect.array.newInstances(int.class,size)

returns int[] and not Integer[] through a hack!

However, int[].class is correctly denoted by Class<int[]>

CS6202 Java Generics 50

Generic Reflection LibraryGeneric Reflection Library

newArray

newArray

CS6202 Java Generics 51

Reflection for GenericReflection for Generic

Non-generic reflection example :

Output :

CS6202 Java Generics 52

Reflection for GenericReflection for Generic

Generic reflection example :

Output :

Bytecode contains generic type information!

Page 14: Lecture 10/11 : Java Generics and Collectionscs6202/slides/10-genericsA_4_in_1.pdf · CS6202 Java Generics 5 Example in Java 1.4 similar code with Array in Java 1.4 CS6202 Java Generics

CS6202 Java Generics 53

Reflecting Generic TypesReflecting Generic Types

Type interface to describe generic type :