Documente Academic
Documente Profesional
Documente Cultură
Prezentare 10:
Genericitate
PROGRAMARE ORIENTATA
OBIECT
2020
Polimorfism parametric
20.11.2020 POO 2
Colectii Java < 1.5
Initial, colectiile Java erau definite pentru valori de tip Object
Puteau stoca valori de orice tip, toate tipurile fiind
// Java 1.4:
ArrayList nume = new ArrayList();
nume.add(“Ana");
nume.add(“Maria");
String student = (String) nume.get(0);
// compileaza, dar genereaza eroare la executie
Patrat pt = (Patrat) nume.get(1);
20.11.2020 POO 3
Parametrizare de tip
List<Tip> nume = new ArrayList<Tip>(); sau
List<Tip> nume = new ArrayList<>();
generica)
List<String> nume = new ArrayList<String>();
nume.add(“Ana");
nume.add(“Maria");
String student = nume.get(0); // fara conversie
Patrat pt = (Patrat) nume.get(1); // eroare compilare
20.11.2020 POO 4
Parametrizare de tip
// o clasa parametrizata (generica)
public class ClasaGen<Tip> {
sau
public class ClasaGen<Tip, Tip, ..., Tip> {
20.11.2020 POO 6
Parametrizare de tip si array
public class GArrs<T> {
private T oVal; // ok
private T[] unArray; // ok
@SuppressWarnings("unchecked")
public GArrs(T param) {
oVal = param; // ok
unArray = (T[]) (new Object[10]); // ok
}
}
20.11.2020 POO 7
Egalitatea obiectelor generice
20.11.2020 POO 8
O interfata generica
// Reprezinta o lista de valori
public interface List<E> {
public void add(E value);
public void add(int index, E value);
public E get(int index);
public int indexOf(E value);
public boolean isEmpty();
public void remove(int index);
public void set(int index, E value);
public int size();
}
20.11.2020 POO 9
Metode generice
public static <Tip> tipRezultat met(param) {
public class Exemplu {
...
public static <T> void afisArr(T[] unArr)
{
for (T a : unArr) {
System.out.print(a);
System.out.print(‘ ‘);
}
}
} Atunci cand exista o metoda generica intr-o clasa (de
cele mai multe ori statica), tipul rezultatului trebuie
precedat de parametrul de tip
20.11.2020 POO 10
Limitarea parametrilor de tip
<Tip extends SuperTip>
O limita superioara; accepta supertipul specificat sau oricare dintre
subtipuri
Pot fi specifiate mai multe interfete cu & :
<Tip extends ClassA & InterfaceB & InterfaceC & ...>
20.11.2020 POO 11
Limitarea parametrilor de tip
20.11.2020 POO 12
Limitarea parametrilor de tip
20.11.2020 POO 13
Limitarea parametrilor de tip
Vrem sa scriem o metoda statica care determina valoarea minima
dintr-un vector (array)
public ClasaM {
public static <T> T arrMin(T[] unArr) {
T min = unArr[0]; T trebuie limitat ai sa
for (T a: unArr) { reprezinte tipurile care au
if (a.compareTo(min) < 0) metoda compareTo
min = a;
}
return min;
}
}
20.11.2020 POO 14
Limitarea parametrilor de tip
Vrem sa scriem o metoda statica care determina valoarea minima
dintr-un vector (array)
public ClasaM {
public static <T extends Comparable<T>> T arrMin(T[] unArr) {
T min = unArr[0];
for (T a: unArr) {
if (a.compareTo(min) < 0)
min = a;
}
return min;
}
}
20.11.2020 POO 15
Wildcards
? reprezinta un tip de date necunoscut
20.11.2020 POO 16
Wildcards
? reprezinta un tip de date necunoscut
20.11.2020 POO 17
Limitarea wildcards
<<interface>>
Comparable<T>
Gadget
20.11.2020 POO 18
Limitarea wildcards
Vrem sa putem compara nu numai obiecte Gadget intre ele, dar si cu
obiecte Widget daca au aceeasi baza de comparatie
public ClasaM {
public static <T extends Comparable<? super T>> T arrMin(T[] unArr)
{
T min = unArr[0];
for (T a: unArr) { ? super T reprezinta orice
if (a.compareTo(min) < 0) superclasa a lui T
min = a;
}
return min;
}
}
20.11.2020 POO 19
Genericitate si subtipare
Este List<String> un subtip al tipului List<Object>?
Este Set<Cal> un subtip al tipului Collection<Animal>?
20.11.2020 POO 20
Genericitate si conversie de tip
Conversia catre tipuri generice va genera warning:
List<?> l = new ArrayList<String>(); // ok
List<String> ls = (List<String>) l; // warning
20.11.2020 POO 21
Type erasure
Toate tipurile generice nelegate devin Object cand sunt compilate
Motivatie: compatibilitate cu vechiul byte code.
La executie, toate instantierile generice au acelasi tip