Metodi generici
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 55 di 87.
Mentre le classi generiche permettono a intere classi di funzionare con tipi diversi, a volte ti serve rendere generico un solo metodo. Un metodo generico dichiara il proprio parametro di tipo, indipendente dai parametri generici a livello di classe.
Il parametro di tipo appare prima del tipo restituito nella firma del metodo:
public class Utility {
public static <T> void printArray(T[] array) {
for (T element : array) {
System.out.println(element);
}
}
}
String[] names = {"Alice", "Bob"};
Integer[] numbers = {1, 2, 3};
Utility.printArray(names); // Funziona con String[]
Utility.printArray(numbers); // Funziona con Integer[]Nota <T> posizionato tra i modificatori e il tipo restituito. Questo dichiara T come parametro di tipo per questo specifico metodo. Il compilatore deduce il tipo effettivo dagli argomenti che passi.
Anche i metodi generici possono restituire il tipo generico:
public static <T> T getFirst(T[] array) {
if (array.length > 0) {
return array[0];
}
return null;
}
String first = getFirst(new String[]{"a", "b"}); // Restituisce "a"Puoi usare più parametri di tipo quando necessario:
public static <K, V> void printPair(K key, V value) {
System.out.println(key + ": " + value);
}
printPair("Age", 25); // String e Integer
printPair(1, "First"); // Integer e StringI metodi generici sono particolarmente utili nelle classi di utilità, quando hai bisogno di operazioni flessibili e riutilizzabili senza creare una classe generica.
Sfida
FacileCostruiamo un toolkit di utilità che mostri la flessibilità dei metodi generici. Creerai una classe con metodi riutilizzabili che funzionano con qualsiasi tipo, dimostrando come i metodi generici possano esistere indipendentemente dalle classi generiche.
Organizzerai il codice in due file:
ArrayUtils.java: crea una classe di utilità contenente metodi generici per lavorare con gli array. La tua classe deve avere tre metodi generici statici:getLast- Un metodo generico che accetta un array di tipoTe restituisce l'ultimo elemento. Se l'array è vuoto, restituiscenull.swap- Un metodo generico che accetta un array di tipoTe due indici interi, quindi scambia gli elementi in quelle posizioni. Questo metodo non restituisce nulla.printWithLabel- Un metodo generico con due parametri di tipoKeV. Accetta un'etichetta di tipoKe un valore di tipoV, quindi li stampa nel formato:[label]: [value]Main.java: metti al lavoro i tuoi metodi generici! Riceverai quattro input: due parole (String) e due numeri (interi).Per prima cosa, crea un array
String[]contenente entrambe le parole. UsagetLastper ottenere l'ultimo elemento e stampa:Last word: [result]Poi, crea un array
Integer[]contenente entrambi i numeri. Chiamaswapper scambiare gli elementi agli indici 0 e 1, quindi stampa:After swap: [first], [second]Infine, mostra il metodo generico con due parametri chiamando
printWithLabeldue volte:- Una volta con la prima parola come etichetta e il primo numero come valore
- Una volta con il primo numero come etichetta e la seconda parola come valore
Riceverai quattro input in quest'ordine: prima parola, seconda parola, primo numero, secondo numero.
Nota come ogni metodo dichiari i propri parametri di tipo con <T> o <K, V> prima del tipo restituito. Il compilatore deduce i tipi effettivi dagli argomenti che passi: non è necessario specificarli esplicitamente quando chiami i metodi!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi gli input
String firstWord = scanner.nextLine();
String secondWord = scanner.nextLine();
int firstNumber = scanner.nextInt();
int secondNumber = scanner.nextInt();
// TODO: Crea un array String[] contenente entrambe le parole
// TODO: Usa ArrayUtils.getLast per ottenere l'ultimo elemento
// Stampa: "Last word: [result]"
// TODO: Crea un array Integer[] contenente entrambi i numeri
// TODO: Chiama ArrayUtils.swap per scambiare gli elementi agli indici 0 e 1
// Stampa: "After swap: [first], [second]"
// TODO: Chiama ArrayUtils.printWithLabel con firstWord come etichetta e firstNumber come valore
// TODO: Chiama ArrayUtils.printWithLabel con firstNumber come etichetta e secondWord come valore
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online