Middle
Τι είναι οι γενικεύσεις (Generics) στον προγραμματισμό;
sobes.tech AI
Απάντηση από AI
Οι Γενικεύσεις (Generics) είναι ένας μηχανισμός στις γλώσσες προγραμματισμού που επιτρέπει τη δημιουργία συστατικών (κλάσεων, διεπαφών, μεθόδων/λειτουργιών) που λειτουργούν με διαφορετικούς τύπους δεδομένων, χωρίς να χάνουν την τύπου ασφαλεία και χωρίς να χρειάζεται να κάνουμε μετατροπές τύπων (casting).
Οι βασικοί στόχοι της χρήσης των Generics:
- Αυξημένη ασφάλεια τύπων: Ο μεταγλωττιστής ελέγχει τους τύπους κατά τη μεταγλώττιση, εντοπίζοντας σφάλματα πριν την εκτέλεση του προγράμματος.
- Βελτίωση αναγνωσιμότητας κώδικα: Είναι σαφές με ποιους τύπους δεδομένων εργάζεται το συστατικό.
- Επαναχρησιμοποίηση κώδικα: Μπορεί να δημιουργηθεί ένα συστατικό που λειτουργεί με διαφορετικούς τύπους, αντί να γραφούν πολλές εκδόσεις.
- Μείωση μετατροπών τύπων: Αποφεύγει την ανάγκη για ρητές μετατροπές τύπων, καθιστώντας τον κώδικα πιο καθαρό και λιγότερο επιρρεπή σε σφάλματα
ClassCastException(σε γλώσσες όπου αυτό ισχύει, π.χ. Java).
Παραδείγματα χρήσης των Generics:
- Συλλογές: Οι λίστες (
List), τα σύνολα (Set), οι απεικονίσεις (Map) μπορούν να αποθηκεύουν στοιχεία συγκεκριμένου τύπου, διασφαλίζοντας ότι στη συλλογή δεν θα εισέλθουν στοιχεία άλλου τύπου. - Μέθοδοι/λειτουργίες: Μια μέθοδος μπορεί να λειτουργεί με παραμέτρους ή να επιστρέφει τιμή γενικού τύπου.
- Κλάσεις/διεπαφές: Μπορούν να δημιουργηθούν δομές δεδομένων ή πρότυπα συμπεριφοράς.
Παράδειγμα σε Java:
// Γενική κλάση ζεύγους
public class Pair<T, U> {
private T first;
private U second;
public Pair(T first, U second) {
this.first = first;
this.second = second;
}
public T getFirst() {
return first;
}
public U getSecond() {
return second;
}
}
// Χρήση
Pair<String, Integer> pair = new Pair<>("Hello", 123);
String str = pair.getFirst(); // Δεν χρειάζεται μετατροπή τύπων
int num = pair.getSecond(); // Δεν χρειάζεται μετατροπή τύπων
// Pair<String, Integer> wrongPair = new Pair<>(123, "Hello"); // Σφάλμα μεταγλώττισης: ασυμφωνία τύπων
Παράδειγμα σε C#:
// Γενική κλάση Pair
public class Pair<T, U>
{
public T First { get; set; }
public U Second { get; set; }
public Pair(T first, U second)
{
First = first;
Second = second;
}
}
// Χρήση
var pair = new Pair<string, int>("Hello", 123);
string str = pair.First; // Δεν χρειάζεται μετατροπή τύπων
int num = pair.Second; // Δεν χρειάζεται μετατροπή τύπων
// var wrongPair = new Pair<string, int>(123, "Hello"); // Σφάλμα μεταγλώττισης: ασυμφωνία τύπων
Παράδειγμα σε TypeScript:
// Γενική λειτουργία για την απόκτηση του πρώτου στοιχείου ενός πίνακα
function getFirstElement<T>(arr: T[]): T | undefined {
if (arr.length > 0) {
return arr[0];
}
return undefined;
}
// Χρήση
let numbers: number[] = [1, 2, 3];
let firstNumber = getFirstElement(numbers); // firstNumber έχει τύπο number
let words: string[] = ["a", "b", "c"];
let firstWord = getFirstElement(words); // firstWord έχει τύπο string
// let mixedArray: (number | string)[] = [1, "a", 2];
// let firstMixed = getFirstElement(mixedArray); // firstMixed έχει τύπο number | string
Έτσι, τα Generics αποτελούν ένα ισχυρό εργαλείο για τη δημιουργία ευέλικτου, ασφαλούς τύπου και επαναχρησιμοποιήσιμου κώδικα.