I GENERICS IN JAVA

BOUNDED TYPES

java-logo

Per capire come si implementano i Bounded Types partiamo subito con un esempio. L’attributo t in figura è di tipo Object, come abbiamo visto nelle lezioni precedenti per trasformarlo in un Type Wrapper occorre usare il metodo intValue().

MyGeneric class

Se proviamo a compilare questa classe otteniamo un errore.

Errore

Non viene riconosciuto dal compilatore perché intValue() è un metodo della classe Number e noi stiamo lavorando con un tipo Object che sta ad un livello più alto, inoltre il metodo quadrato non è un vero metodo generico. Pensa se al posto di un int utilizziamo un boolean. Il problema viene risolto con una delimitazione dei tipi parametrici ammessi, ciò significa usare i Bounded Types.

Extends

Stiamo dicendo questo con <T extends Number>. Questa è una classe generica anche se generica fino a un certo punto. Infatti, il tipo parametrico T deve essere di tipo Number oppure di una sottoclasse del tipo Number. Scriviamo una classe di test per la verifica.

Classe di test

Per concludere osserviamo la figura. T accetta tutti i valori parametrici della superclasse specificata o di una sua sottoclasse.

Tipi Possibili

METODI GENERICI

È possibile dichiarare un metodo generico in una classe non generica. Introduciamo la sintassi. Prima del tipo di ritorno occorre specificare la lista dei tipi parametrici che poi saranno inclusi nei parametri del metodo. Vediamo un esempio per chiarire la definizione riportata in figura.

Metodi generici

L’esempio ritorna un double diviso per due.

Metodo generico

Andiamo a scrivere la classe di test.

Classe di Test

COSTRUTTORI GENERICI

Anche i costruttori di una classe non generica possono essere resi generici così come abbiamo visto per i metodi. Vediamo un costruttore generico.

Costruttore generico

INTERFACE GENERICHE

Introduciamo subito una interface generica. Se una classe implementa una interface generica, allora anche la classe dovrà essere generica, avere lo stesso numero di tipi parametrici che poi dovranno essere compatibili con quelli della interface.

Interface generica

Vediamo la classe di test.

Test class

Vediamo un esempio con un Bounded Types. Non è necessario ripetere il Bounded Types dopo la parola chiave implements in quanto il compilatore è in grado di inferire i giusti Types.

Bounded Types

Al posto di Number nella definizione di classe possiamo usare un tipo compatibile come un Double.

Double

LINK AI POST PRECEDENTI

IL LINGUAGGIO JAVA

LINK AL CODICE SU GITHUB

GITHUB

ESECUZIONE DEL CODICE DI ESEMPIO

  • Scaricare il codice da GITHUB, lanciare il file JAR con il seguente comando in Visual Studio Code, posizionandosi nella directory contenente il JAR.

        java -jar –enable-preview CorsoJava.jar

  • Oppure mettere in esecuzione il main che si trova nel file CorsoJava.java.