67
Generic Programming Prof. Michele Loreti Programmazione Avanzata Corso di Laurea in Informatica (L31) Scuola di Scienze e Tecnologie Prof. Michele Loreti Generic Programming 190 / 216

Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

  • Upload
    others

  • View
    21

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic Programming

Prof. Michele Loreti

Programmazione AvanzataCorso di Laurea in Informatica (L31)Scuola di Scienze e Tecnologie

Prof. Michele Loreti Generic Programming 190 / 216

Page 2: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic class

A generic class is a class with one or more type parameter.

As a simple example consider the class storing key/value pairs:

p u b l i c c l a s s Entry<K, V> {p r i v a t e K key ;p r i v a t e V v a l u e ;p u b l i c E n t r y (K key , V v a l u e ) {

t h i s . key = key ;t h i s . v a l u e = v a l u e ;

}p u b l i c K getKey ( ) { r e t u r n t h i s . key ; }p u b l i c V g e t V a l y e ( ) { r e t u r n t h i s . v a l u e ; }

}

Prof. Michele Loreti Generic Programming 191 / 216

Page 3: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic class

A generic class is a class with one or more type parameter.

As a simple example consider the class storing key/value pairs:

p u b l i c c l a s s Entry<K, V> {p r i v a t e K key ;p r i v a t e V v a l u e ;p u b l i c E n t r y (K key , V v a l u e ) {

t h i s . key = key ;t h i s . v a l u e = v a l u e ;

}p u b l i c K getKey ( ) { r e t u r n t h i s . key ; }p u b l i c V g e t V a l y e ( ) { r e t u r n t h i s . v a l u e ; }

}

Prof. Michele Loreti Generic Programming 191 / 216

Page 4: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic class

A generic class is a class with one or more type parameter.

As a simple example consider the class storing key/value pairs:

p u b l i c c l a s s Entry<K, V> {p r i v a t e K key ;p r i v a t e V v a l u e ;p u b l i c E n t r y (K key , V v a l u e ) {

t h i s . key = key ;t h i s . v a l u e = v a l u e ;

}p u b l i c K getKey ( ) { r e t u r n t h i s . key ; }p u b l i c V g e t V a l y e ( ) { r e t u r n t h i s . v a l u e ; }

}

Prof. Michele Loreti Generic Programming 191 / 216

Page 5: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic class

When the class is instantiated, we have to provide the specific type wewant to use:

Entry<S t r i n g , I n t e g e r > e n t r y = new Entry<S t r i n g , I n t e g e r >(”Harry ” , 17) ;

The type parameters can be omitted in the constructor (exact values areinferred by the context):

Entry<S t r i n g , I n t e g e r > e n t r y = new Entry<>(” Harry ” , 17) ;

The empty pair of angle brackets <> is mandatory! This is sometimenamed diamond

Prof. Michele Loreti Generic Programming 192 / 216

Page 6: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic class

When the class is instantiated, we have to provide the specific type wewant to use:

Entry<S t r i n g , I n t e g e r > e n t r y = new Entry<S t r i n g , I n t e g e r >(”Harry ” , 17) ;

The type parameters can be omitted in the constructor (exact values areinferred by the context):

Entry<S t r i n g , I n t e g e r > e n t r y = new Entry<>(” Harry ” , 17) ;

The empty pair of angle brackets <> is mandatory! This is sometimenamed diamond

Prof. Michele Loreti Generic Programming 192 / 216

Page 7: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic class

When the class is instantiated, we have to provide the specific type wewant to use:

Entry<S t r i n g , I n t e g e r > e n t r y = new Entry<S t r i n g , I n t e g e r >(”Harry ” , 17) ;

The type parameters can be omitted in the constructor (exact values areinferred by the context):

Entry<S t r i n g , I n t e g e r > e n t r y = new Entry<>(” Harry ” , 17) ;

The empty pair of angle brackets <> is mandatory! This is sometimenamed diamond

Prof. Michele Loreti Generic Programming 192 / 216

Page 8: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Example: ArrayList<T>

Generic classes are useful to design data structures.

One of this is ArrayList<T> that implements a generic list containingelements of type T.

Some of the methods provided by this class ArrayList<T> are:

� boolean add(T t): Appends the specified element to the end of this list.

� void clear (): Removes all of the elements from this list.

� boolean contains(Object o): Returns true if this list contains the specifiedelement.

� T get( int i ): Returns the element at the specified position in this list.

� int size (): Returns the number of elements in this list.

� T remove(int i ): Removes the element at the specified position andshifts any subsequent elements to the left.

Prof. Michele Loreti Generic Programming 193 / 216

Page 9: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Example: ArrayList<T>

Generic classes are useful to design data structures.

One of this is ArrayList<T> that implements a generic list containingelements of type T.

Some of the methods provided by this class ArrayList<T> are:

� boolean add(T t): Appends the specified element to the end of this list.

� void clear (): Removes all of the elements from this list.

� boolean contains(Object o): Returns true if this list contains the specifiedelement.

� T get( int i ): Returns the element at the specified position in this list.

� int size (): Returns the number of elements in this list.

� T remove(int i ): Removes the element at the specified position andshifts any subsequent elements to the left.

Prof. Michele Loreti Generic Programming 193 / 216

Page 10: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Example: ArrayList<T>

Generic classes are useful to design data structures.

One of this is ArrayList<T> that implements a generic list containingelements of type T.

Some of the methods provided by this class ArrayList<T> are:

� boolean add(T t): Appends the specified element to the end of this list.

� void clear (): Removes all of the elements from this list.

� boolean contains(Object o): Returns true if this list contains the specifiedelement.

� T get( int i ): Returns the element at the specified position in this list.

� int size (): Returns the number of elements in this list.

� T remove(int i ): Removes the element at the specified position andshifts any subsequent elements to the left.

Prof. Michele Loreti Generic Programming 193 / 216

Page 11: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic Methods. . .

Just like a generic class, a generic method is a method with a typeparameter.

A generic method can be defined either in a generic class or in a standardclass:

p u b l i c c l a s s A r r a y s {p u b l i c s t a t i c <T> v o i d swap ( T [ ] a r r a y , i n t i , i n t j ) {

T temp = a r r a y [ i ] ;a r r a y [ i ] = a r r a y [ j ] ;a r r a y [ j ] = temp ;

}

}

The type parameter (<T>) is placed after the modifier and before thereturn type.

Prof. Michele Loreti Generic Programming 194 / 216

Page 12: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic Methods. . .

Just like a generic class, a generic method is a method with a typeparameter.

A generic method can be defined either in a generic class or in a standardclass:

p u b l i c c l a s s A r r a y s {p u b l i c s t a t i c <T> v o i d swap ( T [ ] a r r a y , i n t i , i n t j ) {

T temp = a r r a y [ i ] ;a r r a y [ i ] = a r r a y [ j ] ;a r r a y [ j ] = temp ;

}

}

The type parameter (<T>) is placed after the modifier and before thereturn type.

Prof. Michele Loreti Generic Programming 194 / 216

Page 13: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic Methods. . .

Just like a generic class, a generic method is a method with a typeparameter.

A generic method can be defined either in a generic class or in a standardclass:

p u b l i c c l a s s A r r a y s {p u b l i c s t a t i c <T> v o i d swap ( T [ ] a r r a y , i n t i , i n t j ) {

T temp = a r r a y [ i ] ;a r r a y [ i ] = a r r a y [ j ] ;a r r a y [ j ] = temp ;

}

}

The type parameter (<T>) is placed after the modifier and before thereturn type.

Prof. Michele Loreti Generic Programming 194 / 216

Page 14: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic methods

When calling the generic method, the type parameter can be omitted:

S t r i n g [ ] f r i e n d s = new S t r i n g [ ] {”Ron” , ” Hermione ” , ” N e v i l ” } ;A r r a y s . swap ( f r i e n d s , 0 , 1 ) ;

Sometime it is useful to explicitly pass the type parameter to the method:

A r r a y s .< S t r i n g >swap ( f r i e n d s , 0 , 1 ) ;

This is useful if we want to control the error message (and in general thetype-inference).

Prof. Michele Loreti Generic Programming 195 / 216

Page 15: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic methods

When calling the generic method, the type parameter can be omitted:

S t r i n g [ ] f r i e n d s = new S t r i n g [ ] {”Ron” , ” Hermione ” , ” N e v i l ” } ;A r r a y s . swap ( f r i e n d s , 0 , 1 ) ;

Sometime it is useful to explicitly pass the type parameter to the method:

A r r a y s .< S t r i n g >swap ( f r i e n d s , 0 , 1 ) ;

This is useful if we want to control the error message (and in general thetype-inference).

Prof. Michele Loreti Generic Programming 195 / 216

Page 16: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic methods

When calling the generic method, the type parameter can be omitted:

S t r i n g [ ] f r i e n d s = new S t r i n g [ ] {”Ron” , ” Hermione ” , ” N e v i l ” } ;A r r a y s . swap ( f r i e n d s , 0 , 1 ) ;

Sometime it is useful to explicitly pass the type parameter to the method:

A r r a y s .< S t r i n g >swap ( f r i e n d s , 0 , 1 ) ;

This is useful if we want to control the error message (and in general thetype-inference).

Prof. Michele Loreti Generic Programming 195 / 216

Page 17: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Example. . .

Consider the following variant:

p u b l i c c l a s s A r r a y s {p u b l i c s t a t i c <T> T [ ] swap ( i n t i , i n t j , T . . . v a l u e s ) {

T temp = v a l u e s [ i ] ;v a l u e s [ i ] = v a l u e s [ j ] ;v a l u e s [ j ] = temp ;r e t u r n v a l u e s ;

}}

Let us consider the following code:

I n t e g e r [ ] r e s u l t = A r r a y s . swap ( 0 , 1 , 1 , 2 , 3) ;

Is this correct?

Prof. Michele Loreti Generic Programming 196 / 216

Page 18: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Example. . .

Consider the following variant:

p u b l i c c l a s s A r r a y s {p u b l i c s t a t i c <T> T [ ] swap ( i n t i , i n t j , T . . . v a l u e s ) {

T temp = v a l u e s [ i ] ;v a l u e s [ i ] = v a l u e s [ j ] ;v a l u e s [ j ] = temp ;r e t u r n v a l u e s ;

}}

Let us consider the following code:

I n t e g e r [ ] r e s u l t = A r r a y s . swap ( 0 , 1 , 1 , 2 , 3) ;

Is this correct?

Prof. Michele Loreti Generic Programming 196 / 216

Page 19: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Example. . .

Consider the following variant:

p u b l i c c l a s s A r r a y s {p u b l i c s t a t i c <T> T [ ] swap ( i n t i , i n t j , T . . . v a l u e s ) {

T temp = v a l u e s [ i ] ;v a l u e s [ i ] = v a l u e s [ j ] ;v a l u e s [ j ] = temp ;r e t u r n v a l u e s ;

}}

Let us consider the following code:

I n t e g e r [ ] r e s u l t = A r r a y s . swap ( 0 , 1 , 1 , 2 , 3) ;

Is this correct?

Prof. Michele Loreti Generic Programming 196 / 216

Page 20: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Example. . .

Consider the following variant:

p u b l i c c l a s s A r r a y s {p u b l i c s t a t i c <T> T [ ] swap ( i n t i , i n t j , T . . . v a l u e s ) {

T temp = v a l u e s [ i ] ;v a l u e s [ i ] = v a l u e s [ j ] ;v a l u e s [ j ] = temp ;r e t u r n v a l u e s ;

}}

Let us consider the following variants:

Double [ ] r e s u l t = A r r a y s . swap ( 0 , 1 , 1 . 5 , 2 , 3) ;

Double [ ] r e s u l t = A r r a y s .<Double>swap ( 0 , 1 , 1 . 5 , 2 , 3) ;

How can we solve this problem?

Prof. Michele Loreti Generic Programming 197 / 216

Page 21: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Example. . .

Consider the following variant:

p u b l i c c l a s s A r r a y s {p u b l i c s t a t i c <T> T [ ] swap ( i n t i , i n t j , T . . . v a l u e s ) {

T temp = v a l u e s [ i ] ;v a l u e s [ i ] = v a l u e s [ j ] ;v a l u e s [ j ] = temp ;r e t u r n v a l u e s ;

}}

Let us consider the following variants:

Double [ ] r e s u l t = A r r a y s . swap ( 0 , 1 , 1 . 5 , 2 , 3) ;

Double [ ] r e s u l t = A r r a y s .<Double>swap ( 0 , 1 , 1 . 5 , 2 , 3) ;

How can we solve this problem?

Prof. Michele Loreti Generic Programming 197 / 216

Page 22: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Type Bounds. . .

Sometime, the type parameters of a generic class or method must need tofulfil certain requirements.

In this case we can specify a type bound to require that the actual typeextends certain classes or implements certain interfaces.

p u b l i c s t a t i c <T e x t e n d s A u t o C l o s e a b l e>v o i d c l o s e A l l ( A r r a y L i s t <T> e lems ) throws E x c e p t i o n {

f o r (T elem : e lems ) elem . c l o s e ( ) ;}

A type parameter can have multiple bounds:

T e x t e n d s Runnable & A u t o C l o s e a b l e

Prof. Michele Loreti Generic Programming 198 / 216

Page 23: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Type Bounds. . .

Sometime, the type parameters of a generic class or method must need tofulfil certain requirements.

In this case we can specify a type bound to require that the actual typeextends certain classes or implements certain interfaces.

p u b l i c s t a t i c <T e x t e n d s A u t o C l o s e a b l e>v o i d c l o s e A l l ( A r r a y L i s t <T> e lems ) throws E x c e p t i o n {

f o r (T elem : e lems ) elem . c l o s e ( ) ;}

A type parameter can have multiple bounds:

T e x t e n d s Runnable & A u t o C l o s e a b l e

Prof. Michele Loreti Generic Programming 198 / 216

Page 24: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Type Bounds. . .

Sometime, the type parameters of a generic class or method must need tofulfil certain requirements.

In this case we can specify a type bound to require that the actual typeextends certain classes or implements certain interfaces.

p u b l i c s t a t i c <T e x t e n d s A u t o C l o s e a b l e>v o i d c l o s e A l l ( A r r a y L i s t <T> e lems ) throws E x c e p t i o n {

f o r (T elem : e lems ) elem . c l o s e ( ) ;}

A type parameter can have multiple bounds:

T e x t e n d s Runnable & A u t o C l o s e a b l e

Prof. Michele Loreti Generic Programming 198 / 216

Page 25: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Type Bounds. . .

Sometime, the type parameters of a generic class or method must need tofulfil certain requirements.

In this case we can specify a type bound to require that the actual typeextends certain classes or implements certain interfaces.

p u b l i c s t a t i c <T e x t e n d s A u t o C l o s e a b l e>v o i d c l o s e A l l ( A r r a y L i s t <T> e lems ) throws E x c e p t i o n {

f o r (T elem : e lems ) elem . c l o s e ( ) ;}

A type parameter can have multiple bounds:

T e x t e n d s Runnable & A u t o C l o s e a b l e

Prof. Michele Loreti Generic Programming 198 / 216

Page 26: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array and subtyping. . .

Let us consider the class Employee and its subclass Manager.

Is a Manager[] a subtype of Employee[]?

Is sound to use a Manager[] where a Employee[] is expected?

The answer is NO!

Let us consider the following portion of (pseudo)-code:

p u b l i c v o i d s e t ( Employee [ ] s t a f f , i n t i , Employee e ) {s t a f f [ i ] = e ;

}. . .Manager [ ] mngrs = . . .s e t ( mngrs , 0 , new Employee ( ) ) ;mngrs [ 0 ] . c a l l M a n a g e r S p e c i f i c M e t h o d ( ) ;

Prof. Michele Loreti Generic Programming 199 / 216

Page 27: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array and subtyping. . .

Let us consider the class Employee and its subclass Manager.

Is a Manager[] a subtype of Employee[]?

Is sound to use a Manager[] where a Employee[] is expected?

The answer is NO!

Let us consider the following portion of (pseudo)-code:

p u b l i c v o i d s e t ( Employee [ ] s t a f f , i n t i , Employee e ) {s t a f f [ i ] = e ;

}. . .Manager [ ] mngrs = . . .s e t ( mngrs , 0 , new Employee ( ) ) ;mngrs [ 0 ] . c a l l M a n a g e r S p e c i f i c M e t h o d ( ) ;

Prof. Michele Loreti Generic Programming 199 / 216

Page 28: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array and subtyping. . .

Let us consider the class Employee and its subclass Manager.

Is a Manager[] a subtype of Employee[]?

Is sound to use a Manager[] where a Employee[] is expected?

The answer is NO!

Let us consider the following portion of (pseudo)-code:

p u b l i c v o i d s e t ( Employee [ ] s t a f f , i n t i , Employee e ) {s t a f f [ i ] = e ;

}. . .Manager [ ] mngrs = . . .s e t ( mngrs , 0 , new Employee ( ) ) ;mngrs [ 0 ] . c a l l M a n a g e r S p e c i f i c M e t h o d ( ) ;

Prof. Michele Loreti Generic Programming 199 / 216

Page 29: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array and subtyping. . .

Let us consider the class Employee and its subclass Manager.

Is a Manager[] a subtype of Employee[]?

Is sound to use a Manager[] where a Employee[] is expected?

The answer is NO!

Let us consider the following portion of (pseudo)-code:

p u b l i c v o i d s e t ( Employee [ ] s t a f f , i n t i , Employee e ) {s t a f f [ i ] = e ;

}. . .Manager [ ] mngrs = . . .s e t ( mngrs , 0 , new Employee ( ) ) ;mngrs [ 0 ] . c a l l M a n a g e r S p e c i f i c M e t h o d ( ) ;

Prof. Michele Loreti Generic Programming 199 / 216

Page 30: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array and subtyping. . .

Let us consider the class Employee and its subclass Manager.

Is a Manager[] a subtype of Employee[]?

Is sound to use a Manager[] where a Employee[] is expected?

The answer is NO!

Let us consider the following portion of (pseudo)-code:

p u b l i c v o i d s e t ( Employee [ ] s t a f f , i n t i , Employee e ) {s t a f f [ i ] = e ;

}. . .Manager [ ] mngrs = . . .s e t ( mngrs , 0 , new Employee ( ) ) ;mngrs [ 0 ] . c a l l M a n a g e r S p e c i f i c M e t h o d ( ) ;

Prof. Michele Loreti Generic Programming 199 / 216

Page 31: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic classes and Subtyping. . .

Similarly, in general we cannot use an ArrayList<Manager> where anArrayList<Employee> is expected.

However, it could be convenient to use a mechanism where we can definea method where a list of elements extending a base class is expected.

Prof. Michele Loreti Generic Programming 200 / 216

Page 32: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Generic classes and Subtyping. . .

Similarly, in general we cannot use an ArrayList<Manager> where anArrayList<Employee> is expected.

However, it could be convenient to use a mechanism where we can definea method where a list of elements extending a base class is expected.

Prof. Michele Loreti Generic Programming 200 / 216

Page 33: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array Covariance. . .

In Java, for reason related to usability, we can use an array of a subclasswhere an array of a superclass is expected:

p u b l i c s t a t i c v o i d p r o c e s s ( Employee [ ] s t a f f ) { . . . }

We can pass a Manager[] array since Manager[]!

This behaviour is called covariance.

Warning: this is unsound and an ArrayStoreException is thrown if a wrongassignment is performed.

This mechanism cannot be used for generic classes!

Prof. Michele Loreti Generic Programming 201 / 216

Page 34: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array Covariance. . .

In Java, for reason related to usability, we can use an array of a subclasswhere an array of a superclass is expected:

p u b l i c s t a t i c v o i d p r o c e s s ( Employee [ ] s t a f f ) { . . . }

We can pass a Manager[] array since Manager[]!

This behaviour is called covariance.

Warning: this is unsound and an ArrayStoreException is thrown if a wrongassignment is performed.

This mechanism cannot be used for generic classes!

Prof. Michele Loreti Generic Programming 201 / 216

Page 35: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array Covariance. . .

In Java, for reason related to usability, we can use an array of a subclasswhere an array of a superclass is expected:

p u b l i c s t a t i c v o i d p r o c e s s ( Employee [ ] s t a f f ) { . . . }

We can pass a Manager[] array since Manager[]!

This behaviour is called covariance.

Warning: this is unsound and an ArrayStoreException is thrown if a wrongassignment is performed.

This mechanism cannot be used for generic classes!

Prof. Michele Loreti Generic Programming 201 / 216

Page 36: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array Covariance. . .

In Java, for reason related to usability, we can use an array of a subclasswhere an array of a superclass is expected:

p u b l i c s t a t i c v o i d p r o c e s s ( Employee [ ] s t a f f ) { . . . }

We can pass a Manager[] array since Manager[]!

This behaviour is called covariance.

Warning: this is unsound and an ArrayStoreException is thrown if a wrongassignment is performed.

This mechanism cannot be used for generic classes!

Prof. Michele Loreti Generic Programming 201 / 216

Page 37: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Array Covariance. . .

In Java, for reason related to usability, we can use an array of a subclasswhere an array of a superclass is expected:

p u b l i c s t a t i c v o i d p r o c e s s ( Employee [ ] s t a f f ) { . . . }

We can pass a Manager[] array since Manager[]!

This behaviour is called covariance.

Warning: this is unsound and an ArrayStoreException is thrown if a wrongassignment is performed.

This mechanism cannot be used for generic classes!

Prof. Michele Loreti Generic Programming 201 / 216

Page 38: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Subtype wildcards

To partially solve this problem we can use wildcards:

p u b l i c v o i d pr intNames (A r r a y L i s t <? e x t e n d s Employee> s t a f f) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;

}}

The wild card ? extends Employee indicates any type extending Employee.

We can pass to this method either an ArrayList<Employee> or anArrayList<Manager>.

Prof. Michele Loreti Generic Programming 202 / 216

Page 39: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Subtype wildcards

To partially solve this problem we can use wildcards:

p u b l i c v o i d pr intNames (A r r a y L i s t <? e x t e n d s Employee> s t a f f) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;

}}

The wild card ? extends Employee indicates any type extending Employee.

We can pass to this method either an ArrayList<Employee> or anArrayList<Manager>.

Prof. Michele Loreti Generic Programming 202 / 216

Page 40: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Subtype wildcards

To partially solve this problem we can use wildcards:

p u b l i c v o i d pr intNames (A r r a y L i s t <? e x t e n d s Employee> s t a f f) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;

}}

The wild card ? extends Employee indicates any type extending Employee.

We can pass to this method either an ArrayList<Employee> or anArrayList<Manager>.

Prof. Michele Loreti Generic Programming 202 / 216

Page 41: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Subtype wildcards

To partially solve this problem we can use wildcards:

p u b l i c v o i d pr intNames (A r r a y L i s t <? e x t e n d s Employee> s t a f f) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;

}}

The wild card ? extends Employee indicates any type extending Employee.

We can pass to this method either an ArrayList<Employee> or anArrayList<Manager>.

Prof. Michele Loreti Generic Programming 202 / 216

Page 42: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Subtype wildcards

How can we use an instance of ArrayList<? extends Employee>? (say it staff )

Question: Is the following code valid?

Employee e = s t a f f . g e t ( i ) ;

Answer: Yes!

Question: Is the following code valid?

s t a f f . add ( new Employee ( . . . ) ) ;

Answer: No!

Prof. Michele Loreti Generic Programming 203 / 216

Page 43: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Subtype wildcards

How can we use an instance of ArrayList<? extends Employee>? (say it staff )

Question: Is the following code valid?

Employee e = s t a f f . g e t ( i ) ;

Answer: Yes!

Question: Is the following code valid?

s t a f f . add ( new Employee ( . . . ) ) ;

Answer: No!

Prof. Michele Loreti Generic Programming 203 / 216

Page 44: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Subtype wildcards

How can we use an instance of ArrayList<? extends Employee>? (say it staff )

Question: Is the following code valid?

Employee e = s t a f f . g e t ( i ) ;

Answer: Yes!

Question: Is the following code valid?

s t a f f . add ( new Employee ( . . . ) ) ;

Answer: No!

Prof. Michele Loreti Generic Programming 203 / 216

Page 45: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Subtype wildcards

How can we use an instance of ArrayList<? extends Employee>? (say it staff )

Question: Is the following code valid?

Employee e = s t a f f . g e t ( i ) ;

Answer: Yes!

Question: Is the following code valid?

s t a f f . add ( new Employee ( . . . ) ) ;

Answer: No!

Prof. Michele Loreti Generic Programming 203 / 216

Page 46: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Subtype wildcards

How can we use an instance of ArrayList<? extends Employee>? (say it staff )

Question: Is the following code valid?

Employee e = s t a f f . g e t ( i ) ;

Answer: Yes!

Question: Is the following code valid?

s t a f f . add ( new Employee ( . . . ) ) ;

Answer: No!

Prof. Michele Loreti Generic Programming 203 / 216

Page 47: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Supertype Wildcards

We can use wildcards to ask that a given parameter is a supertype ofanother type.

Let us consider the following code:

p u b l i c v o i d p r i n t A l l (A r r a y L i s t <? e x t e n d s Employee> s t a f f ,P r e d i c a t e <Employee> f i l t e r) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {i f ( f i l t e r . t e s t ( e ) ) {

System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;}

}}

Prof. Michele Loreti Generic Programming 204 / 216

Page 48: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Supertype Wildcards

We can use wildcards to ask that a given parameter is a supertype ofanother type.

Let us consider the following code:

p u b l i c v o i d p r i n t A l l (A r r a y L i s t <? e x t e n d s Employee> s t a f f ,P r e d i c a t e <Employee> f i l t e r) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {i f ( f i l t e r . t e s t ( e ) ) {

System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;}

}}

Prof. Michele Loreti Generic Programming 204 / 216

Page 49: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Supertype Wildcards

A typical use of method printAll is:

p r i n t A l l ( employees , e −> e . g e t S a l a r y ( ) > 10000) ;

Another example is:

p r i n t A l l ( employees , e −> e . t o S t r i n g ( ) . l e n g t h ( ) % 2 == 0) ;

Warning: the last one does not work!

The problem is that

e −> e . t o S t r i n g ( ) . l e n g t h ( ) % 2 == 0

has type Predicate<Object>.

Prof. Michele Loreti Generic Programming 205 / 216

Page 50: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Supertype Wildcards

A typical use of method printAll is:

p r i n t A l l ( employees , e −> e . g e t S a l a r y ( ) > 10000) ;

Another example is:

p r i n t A l l ( employees , e −> e . t o S t r i n g ( ) . l e n g t h ( ) % 2 == 0) ;

Warning: the last one does not work!

The problem is that

e −> e . t o S t r i n g ( ) . l e n g t h ( ) % 2 == 0

has type Predicate<Object>.

Prof. Michele Loreti Generic Programming 205 / 216

Page 51: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Supertype Wildcards

A typical use of method printAll is:

p r i n t A l l ( employees , e −> e . g e t S a l a r y ( ) > 10000) ;

Another example is:

p r i n t A l l ( employees , e −> e . t o S t r i n g ( ) . l e n g t h ( ) % 2 == 0) ;

Warning: the last one does not work!

The problem is that

e −> e . t o S t r i n g ( ) . l e n g t h ( ) % 2 == 0

has type Predicate<Object>.

Prof. Michele Loreti Generic Programming 205 / 216

Page 52: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Supertype Wildcards

A typical use of method printAll is:

p r i n t A l l ( employees , e −> e . g e t S a l a r y ( ) > 10000) ;

Another example is:

p r i n t A l l ( employees , e −> e . t o S t r i n g ( ) . l e n g t h ( ) % 2 == 0) ;

Warning: the last one does not work!

The problem is that

e −> e . t o S t r i n g ( ) . l e n g t h ( ) % 2 == 0

has type Predicate<Object>.

Prof. Michele Loreti Generic Programming 205 / 216

Page 53: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Supertype Wildcards

Supertype wildcards can be used:

p u b l i c v o i d p r i n t A l l (A r r a y L i s t <? e x t e n d s Employee> s t a f f ,P r e d i c a t e <? s u p e r Employee> f i l t e r) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {i f ( f i l t e r . t e s t ( e ) ) {

System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;}

}}

In that case we can use any predicate defined on any superclass of Employee.

Prof. Michele Loreti Generic Programming 206 / 216

Page 54: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Supertype Wildcards

Supertype wildcards can be used:

p u b l i c v o i d p r i n t A l l (A r r a y L i s t <? e x t e n d s Employee> s t a f f ,P r e d i c a t e <? s u p e r Employee> f i l t e r) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {i f ( f i l t e r . t e s t ( e ) ) {

System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;}

}}

In that case we can use any predicate defined on any superclass of Employee.

Prof. Michele Loreti Generic Programming 206 / 216

Page 55: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Wildcards and Type Variables

We can generalise method printAll to work with any type T:

p u b l i c <T> v o i d p r i n t A l l (A r r a y L i s t <T> s t a f f ,P r e d i c a t e <? s u p e r T> f i l t e r) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {i f ( f i l t e r . t e s t ( e ) ) {

System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;}

}}

Prof. Michele Loreti Generic Programming 207 / 216

Page 56: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Wildcards and Type Variables

We can generalise method printAll to work with any type T:

p u b l i c <T> v o i d p r i n t A l l (A r r a y L i s t <T> s t a f f ,P r e d i c a t e <? s u p e r T> f i l t e r) {

f o r ( i n t i =0 ; i<s t a f f . s i z e ( ) ; i++ ) {i f ( f i l t e r . t e s t ( e ) ) {

System . out . p r i n t l n ( s t a f f . g e t ( i ) . getName ( ) ) ;}

}}

Prof. Michele Loreti Generic Programming 207 / 216

Page 57: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Unbounded Wildcards

When we have limited information about the exact type we are receiving,unbounded wildcards can be used:

p u b l i c s t a t i c b o o l e a n h a s N u l l ( A r r a y L i s t <?> e l e m e n t s ) {f o r ( i n t i =0 ; i<e l e m e n t s . s i z e ( ) ; i++ ) {

i f ( e l e m e n t s . g e t ( i ) == n u l l ) {r e t u r n t r u e ;

}}r e t u r n f a l s e ;

}

Prof. Michele Loreti Generic Programming 208 / 216

Page 58: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Unbounded Wildcards

When we have limited information about the exact type we are receiving,unbounded wildcards can be used:

p u b l i c s t a t i c b o o l e a n h a s N u l l ( A r r a y L i s t <?> e l e m e n t s ) {f o r ( i n t i =0 ; i<e l e m e n t s . s i z e ( ) ; i++ ) {

i f ( e l e m e n t s . g e t ( i ) == n u l l ) {r e t u r n t r u e ;

}}r e t u r n f a l s e ;

}

Prof. Michele Loreti Generic Programming 208 / 216

Page 59: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Type Erasure

When a generic class is compiled all the generic informations are lost andthe class is translated into a raw type.

For instance, the class Entry considered before is handled as:

p u b l i c c l a s s E n t r y {p r i v a t e Object key ;p r i v a t e Object v a l u e ;p u b l i c E n t r y (K key , V v a l u e ) {

t h i s . key = key ;t h i s . v a l u e = v a l u e ;

}p u b l i c Object getKey ( ) { r e t u r n t h i s . key ; }p u b l i c Object g e t V a l y e ( ) { r e t u r n t h i s . v a l u e ; }

}

Prof. Michele Loreti Generic Programming 209 / 216

Page 60: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Type Erasure

When a generic class is compiled all the generic informations are lost andthe class is translated into a raw type.

For instance, the class Entry considered before is handled as:

p u b l i c c l a s s E n t r y {p r i v a t e Object key ;p r i v a t e Object v a l u e ;p u b l i c E n t r y (K key , V v a l u e ) {

t h i s . key = key ;t h i s . v a l u e = v a l u e ;

}p u b l i c Object getKey ( ) { r e t u r n t h i s . key ; }p u b l i c Object g e t V a l y e ( ) { r e t u r n t h i s . v a l u e ; }

}

Prof. Michele Loreti Generic Programming 209 / 216

Page 61: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Type Erasure

When a generic class is compiled all the generic informations are lost andthe class is translated into a raw type.

For instance, the class Entry considered before is handled as:

p u b l i c c l a s s E n t r y {p r i v a t e Object key ;p r i v a t e Object v a l u e ;p u b l i c E n t r y (K key , V v a l u e ) {

t h i s . key = key ;t h i s . v a l u e = v a l u e ;

}p u b l i c Object getKey ( ) { r e t u r n t h i s . key ; }p u b l i c Object g e t V a l y e ( ) { r e t u r n t h i s . v a l u e ; }

}

Prof. Michele Loreti Generic Programming 209 / 216

Page 62: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Restrictions on Generics

� No primitive type arguments;

� At Runtime, all type are raws. . .

i f ( a i n s t a n c e o f A r r a y L i s t <S t r i n g ) . . . //WRONG!

� Type variables cannot be instantiated;

� Arrays of parametrised type cannot be constructed;

� Class type variables cannot be used in static context.

Prof. Michele Loreti Generic Programming 210 / 216

Page 63: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Restrictions on Generics

� No primitive type arguments;

� At Runtime, all type are raws. . .

i f ( a i n s t a n c e o f A r r a y L i s t <S t r i n g ) . . . //WRONG!

� Type variables cannot be instantiated;

� Arrays of parametrised type cannot be constructed;

� Class type variables cannot be used in static context.

Prof. Michele Loreti Generic Programming 210 / 216

Page 64: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Restrictions on Generics

� No primitive type arguments;

� At Runtime, all type are raws. . .

i f ( a i n s t a n c e o f A r r a y L i s t <S t r i n g ) . . . //WRONG!

� Type variables cannot be instantiated;

� Arrays of parametrised type cannot be constructed;

� Class type variables cannot be used in static context.

Prof. Michele Loreti Generic Programming 210 / 216

Page 65: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Restrictions on Generics

� No primitive type arguments;

� At Runtime, all type are raws. . .

i f ( a i n s t a n c e o f A r r a y L i s t <S t r i n g ) . . . //WRONG!

� Type variables cannot be instantiated;

� Arrays of parametrised type cannot be constructed;

� Class type variables cannot be used in static context.

Prof. Michele Loreti Generic Programming 210 / 216

Page 66: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

Restrictions on Generics

� No primitive type arguments;

� At Runtime, all type are raws. . .

i f ( a i n s t a n c e o f A r r a y L i s t <S t r i n g ) . . . //WRONG!

� Type variables cannot be instantiated;

� Arrays of parametrised type cannot be constructed;

� Class type variables cannot be used in static context.

Prof. Michele Loreti Generic Programming 210 / 216

Page 67: Generic Programming - didattica.cs.unicam.itdidattica.cs.unicam.it/lib/exe/fetch.php?media=didattica:triennale:pa:... · Generic Programming Prof. Michele Loreti Programmazione Avanzata

To be continued. . .

Prof. Michele Loreti Generic Programming 211 / 216