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 |
Όχι | Ναι |