Sobes.tech
Junior

Ποια είδη γενικών γνωρίζετε;

sobes.tech AI

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

Αμετάβλητα, συσχετικά και αντισυσχετικά.

  • Αμετάβλητο: Ο τύπος List<A> δεν είναι υποτύπος του List<B> και το αντίστροφο, ακόμη και αν το A είναι υποτύπος του B. Ο τύπος διατηρείται ακριβώς.
  • Συσχετικότητα (out): Επιτρέπει τη χρήση υποτύπων. Το List<A> είναι υποτύπος του List<B> αν το A είναι υποτύπος του B. Χρησιμοποιείται για εξωτερικές παραμέτρους (επιστρεφόμενες τιμές).
fun foo(list: List<out Number>) {
    // Μπορεί να διαβάσει από τη λίστα (Number, Double, Int κ.λπ.)
    val number: Number = list[0]
    // Δεν μπορεί να προσθέσει στη λίστα (δεν γνωρίζουμε ποιος τύπος στοιχείων αναμένεται)
    // list.add(1) // Σφάλμα μεταγλώττισης
}
  • Αντισυσχετικότητα (in): Επιτρέπει τη χρήση υπερτύπων. Το List<B> είναι υποτύπος του List<A> αν το A είναι υποτύπος του B. Χρησιμοποιείται για εισερχόμενες παραμέτρους (ορίσματα).
fun foo(comparable: Comparable<in String>) {
    // Μπορεί να περάσει ορίσματα String (ή τα υπερτύπα του)
    val result = comparable.compareTo("hello")
    // Δεν μπορεί να λαμβάνει αποτελέσματα τύπου String (δεν γνωρίζουμε ποιος τύπος αποτελέσματος)
    // val str: String = comparable.compareTo("world") // Σφάλμα μεταγλώττισης
}

Στην Kotlin, αυτές οι έννοιες υλοποιούνται με τις διακριτικές out και in στις παραμέτρους τύπου. Στη Java, χρησιμοποιούνται wildcards (? extends για συσχετικότητα και ? super για αντισυσχετικότητα).

Τύπος Σκοπός Λέξη-κλειδί (Kotlin) Wildcard (Java) Ανάγνωση επιτρέπεται Γραφή επιτρέπεται
Αμετάβλητος Ακριβής αντιστοιχία τύπου Όχι Όχι Ναι Ναι
Συσχετικός Χρήση υποτύπων (παραγωγός - "out") out ? extends T Ναι Όχι
Αντισυσχετικός Χρήση υπερτύπων (καταναλωτής - "in") in ? super T Όχι Ναι