Els generics són una característica poderosa de Java que permeten definir classes, interfícies i mètodes amb tipus de dades parametritzats. Això proporciona una manera de crear codi més flexible i reutilitzable, alhora que millora la seguretat del tipus en temps de compilació.
Conceptes Clau
- Tipus Parametritzats: Permeten definir classes, interfícies i mètodes amb un o més paràmetres de tipus.
- Seguretat del Tipus: Els generics permeten detectar errors de tipus en temps de compilació en lloc de temps d'execució.
- Reutilització del Codi: Faciliten la creació de codi reutilitzable que pot treballar amb qualsevol tipus d'objecte.
Definició de Generics
Classes Generiques
Una classe genèrica es defineix utilitzant un o més paràmetres de tipus. Aquests paràmetres es col·loquen entre els símbols <
i >
després del nom de la classe.
public class Caixa<T> { private T contingut; public void posar(T contingut) { this.contingut = contingut; } public T obtenir() { return contingut; } }
En aquest exemple, Caixa
és una classe genèrica amb un paràmetre de tipus T
. Això significa que Caixa
pot contenir qualsevol tipus d'objecte.
Mètodes Generics
Els mètodes també poden ser generics. Els paràmetres de tipus es defineixen abans del tipus de retorn del mètode.
public class Utilitats { public static <T> void imprimirArray(T[] array) { for (T element : array) { System.out.println(element); } } }
En aquest exemple, imprimirArray
és un mètode genèric que pot imprimir elements de qualsevol tipus d'array.
Utilització de Generics
Creació d'Objectes Generics
Quan es crea una instància d'una classe genèrica, es substitueix el paràmetre de tipus per un tipus concret.
Caixa<String> caixaDeText = new Caixa<>(); caixaDeText.posar("Hola, Generics!"); System.out.println(caixaDeText.obtenir());
En aquest exemple, Caixa<String>
és una instància de Caixa
que conté objectes de tipus String
.
Tipus Genèrics Limitats
Els tipus genèrics es poden limitar per assegurar-se que només accepten certs tipus de dades. Això es fa utilitzant la paraula clau extends
.
public class CaixaLimitada<T extends Number> { private T contingut; public void posar(T contingut) { this.contingut = contingut; } public T obtenir() { return contingut; } }
En aquest exemple, CaixaLimitada
només accepta tipus que són subclasses de Number
.
Exercicis Pràctics
Exercici 1: Crear una Classe Genèrica
Crea una classe genèrica Parell
que emmagatzemi dos objectes del mateix tipus.
public class Parell<T> { private T primer; private T segon; public Parell(T primer, T segon) { this.primer = primer; this.segon = segon; } public T getPrimer() { return primer; } public T getSegon() { return segon; } }
Exercici 2: Utilitzar una Classe Genèrica
Utilitza la classe Parell
per emmagatzemar un parell de nombres enters i un parell de cadenes de text.
public class TestParell { public static void main(String[] args) { Parell<Integer> parellEnter = new Parell<>(1, 2); System.out.println("Primer: " + parellEnter.getPrimer() + ", Segon: " + parellEnter.getSegon()); Parell<String> parellText = new Parell<>("Hola", "Generics"); System.out.println("Primer: " + parellText.getPrimer() + ", Segon: " + parellText.getSegon()); } }
Errors Comuns i Consells
- Tipus Primitivus: Els generics no poden utilitzar tipus primitius com
int
,char
, etc. Utilitza les seves classes envoltants (Integer
,Character
, etc.). - Tipus Raw: Evita utilitzar tipus raw (sense paràmetres de tipus). Això pot provocar advertències de compilació i errors en temps d'execució.
- Conversió de Tipus: No facis conversions de tipus innecessàries. Els generics estan dissenyats per evitar la necessitat de conversions explícites.
Conclusió
Els generics són una eina poderosa en Java que permeten escriure codi més flexible, reutilitzable i segur. Comprendre com definir i utilitzar classes i mètodes generics és essencial per a qualsevol programador de Java. Amb la pràctica, els generics es convertiran en una part natural del teu repertori de programació.
Curs de Programació en Java
Mòdul 1: Introducció a Java
- Introducció a Java
- Configuració de l'Entorn de Desenvolupament
- Sintaxi i Estructura Bàsica
- Variables i Tipus de Dades
- Operadors
Mòdul 2: Flux de Control
Mòdul 3: Programació Orientada a Objectes
- Introducció a la POO
- Classes i Objectes
- Mètodes
- Constructors
- Herència
- Polimorfisme
- Encapsulació
- Abstracció
Mòdul 4: Programació Orientada a Objectes Avançada
Mòdul 5: Estructures de Dades i Col·leccions
Mòdul 6: Gestió d'Excepcions
Mòdul 7: Entrada/Sortida de Fitxers
- Lectura de Fitxers
- Escriptura de Fitxers
- Fluxos de Fitxers
- BufferedReader i BufferedWriter
- Serialització
Mòdul 8: Multithreading i Concurrència
- Introducció al Multithreading
- Creació de Fils
- Cicle de Vida dels Fils
- Sincronització
- Utilitats de Concurrència
Mòdul 9: Xarxes
- Introducció a les Xarxes
- Sockets
- ServerSocket
- DatagramSocket i DatagramPacket
- URL i HttpURLConnection