JavaProgrammazione

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>