Generics
Classi, interfacce e metodi per i quali il tipo di dato sul quale si opera può essere specificato come parametro, quindi realizzare un algoritmo che astrae dal tipo di dato specifico.
Ecco un semplice esempio, iniziamo col definire due classi
Quindi definiamo la classe generics, notiamo il carattere T tra le parentesi angolari. Per convenzione si usa un carattere maiuscolo e i caratteri da usare sono T, E, V e K.
Qui definiamo operazione senza specificarne il contenuto
Quindi definiamo nel main l’uso della funzione e l’output
Le classi Sommare e Sottrarre non hanno un parametro definito quindi viene sostituito dinamicamente, se invece vogliamo definire il tipo di parametro dobbiamo fare delle semplici modifiche. Intanto definiamo un’interfaccia senza metodi
Modifichiamo le Classi Sommare e Sottrarre in modo che implementino questa interfaccia
public class Sommare implements Matematica {
allo stesso modo anche l’altra classe public class Sottrarre implements Matematica { |
Fatto ciò dobbiamo ridefinire la classe generics Operazione in modo da specificare che il parametro deve essere compatibile con il tipo Matematica
class Operazione <T extends Matematica> { |
La classe Calcola utilizzava il carattere “?” (jolly) per non specificare il tipo di contenuto, ma possiamo specificare una limitazione:
- <? extends Matematica> – limitazione superiore per evitare il passaggio di tipi che non hanno significato;
- <? super Matematica> – limitazione inferiore per passare solo classi che sono super-tipi di Matematica;
Aggiorniamo ora il nostro esempio con dei metodi (costruttori) associati alle classi, un costruttore di una classe può essere generico anche se la classe non lo è.
Il parametro T è limitato superiormente per accettare solo tipi compatibili con:
Operazione <? extends Matematica> |
Anche le interfacce possono essere generiche
public interface Matematica <T> {} |
Ed infine modifichiamo Sommare e Sottrearre in modo che specificano il tipo di parametro richiesto
public class Sommare implements Matematica <Sommare>
e public class Sottrarre implements Matematica <Sottrarre> |