Il Type Inference dei metodi parametrici – Lezione 24 di Java Avanzato

Individuare il tipo migliore dei metodi con la Type inference

Quando si utilizzano i tipi parametrici non è obbligatorio specificarli durante la loro invocazione. Utilizzando una classe senza i parametri comporta la perdita di tutti i vantaggi delle classi parametriche; invece, utilizzando un metodo parametrico in cui non vengono specificati i parametri di tipo il discorso cambia. Per i metodi parametrici viene attivato il meccanismo del Type Inference. Si tratta di un algoritmo che cerca di indovinare qual è il tipo migliore da dare al metodo. Si utilizza il termine “indovinare” perché questo algoritmo non è né corretto né completo, ci sono casi in cui esiste una soluzione ma non la trova e casi in cui non esiste una soluzione ma ne trova una.

Possiamo affermare che intuitivamente:
la Type Inference tenta di individuare il tipo più specifico che rende corretta la chiamata del metodo utilizzato“.

Essendo un algoritmo non affidabile è sempre consigliato specificare i parametri di tipo. Se nella classe A è presente il metodo getFirstElem, utilizzato nella lezione sulle classi parametriche, avremmo:

  String[] array = {"a", "b", "c"};
  String s = A.<String>getFirstElem(array);

In questo caso abbiamo specificato il tipo di ritorno del metodo. Senza specificare il valore di ritorno avremmo:

  String s = A.getFirstElem(array);

In questo caso l’algoritmo del type inference funziona ed individua che String è il tipo più specifico da dare al tipo di ritorno del metodo utilizzato.

Dato un altro esempio:

  public static <T> void fill(T[] a, T[] x) {
    for(int i = 0; i < a.length; i++;
      a[i] = x;
    }
  }

Questo metodo accetta un array ed un oggetto dello stesso tipo e restituisce l’array con tutti i suoi campi impostati con l’oggetto dato in ingresso. Un’invocazione del genere non provoca errori:

  String[] a = new String[5];
  fill(a, "Ciao");

Il type inference riesce a capire che il tipo più specifico è String. Invocando il metodo nel seguente modo:

  fill(a, new Integer(10);

Il type inference individuato come tipo di ritorno più specifico Object senza provocare errori. A runtime avremo il lancio di un’eccezione perché non abbiamo un array di Object ma di String che non può contenere Integer. Ad ogni assegnazione in un array viene fatto in automatico un controllo sul tipo inserito, per queste ragioni ad ogni assegnazione verrà generata un’eccezione.

Per questi ragioni, è consigliato di specificare sempre i parametri di tipo in modo da poter gestire gli errori a tempo di compilazione e non direttamente a runtime.

Indice Lezione PrecedenteLezione Successiva

Pubblicato in Guide, Java, Programmazione Taggato con: , , ,

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

*