Sobes.tech
Middle

Τι είναι τα Generics και για ποιο λόγο χρησιμοποιούνται;

sobes.tech AI

Απάντηση από AI

Τα Generics στη Java επιτρέπουν τη δημιουργία κλάσεων, διεπαφών και μεθόδων που λειτουργούν με παραμετροποιημένους τύπους.

Ο κύριος σκοπός των Generics:

  • Αυξημένη ασφάλεια τύπων: Ο μεταγλωττιστής ελέγχει τους τύπους κατά τη φάση της μεταγλώττισης, αποτρέποντας το ClassCastException κατά την εκτέλεση.
  • Απαλλαγή από μετατροπές τύπων: Δεν χρειάζεται να μετατρέπετε χειροκίνητα τους τύπους κατά την ανάκτηση στοιχείων από συλλογές.
  • Δημιουργία πιο ευέλικτου και επαναχρησιμοποιήσιμου κώδικα: Μπορείτε να γράψετε γενικούς αλγόριθμους και δομές δεδομένων που εφαρμόζονται σε διάφορους τύπους δεδομένων.

Παράδειγμα χωρίς Generics:

// Πριν από το Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // χωρίς τύπο
        list.add("γεια");
        list.add(123); // μπορεί να προστεθεί οποιοδήποτε αντικείμενο

        String s = (String) list.get(0); // απαιτείται μετατροπή τύπου
        Integer i = (Integer) list.get(1); // απαιτείται μετατροπή τύπου

        // Μπορεί να προκύψει σφάλμα μετατροπής
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Παράδειγμα με Generics:

// Με Generics
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // λίστα συμβολοσειρών
        list.add("γεια");
        // list.add(123); // σφάλμα μεταγλώττισης - δεν μπορεί να προστεθεί Integer

        String s = list.get(0); // χωρίς ανάγκη μετατροπής τύπου

        // Δεν είναι δυνατή η προσθήκη άλλου τύπου, αποτρέπει σφάλματα
        // List<Integer> intList = new ArrayList<>();
        // intList.add("κόσμος"); // σφάλμα μεταγλώττισης
        System.out.println(s);
    }
}

Τα Generics χρησιμοποιούνται επίσης σε:

  • Κλάσεις: ArrayList<E>, HashMap<K, V>
  • Διεπαφές: List<E>, Map<K, V>
  • Μέθοδοι: <T> void printArray(T[] array)
  • Περιορισμοί τύπων: <T extends Comparable<T>> (περιορισμός σε τύπους που υλοποιούν το Comparable)

Η υλοποίηση των Generics στη Java βασίζεται στην "εξάλειψη τύπων" (type erasure) κατά τη φάση της μεταγλώττισης. Αυτό σημαίνει ότι οι πληροφορίες σχετικά με τους γενικούς τύπους διαγράφονται, και κατά την εκτέλεση η JVM λειτουργεί με ακατέργαστους τύπους. Αυτό διασφαλίζει συμβατότητα με παλαιότερες εκδόσεις της Java, αλλά έχει ορισμένους περιορισμούς.