Junior
რომელი გენერიკების ტიპებს იცნობთ?
sobes.tech AI
პასუხი AI-სგან
ინვარიანტული, კოვარიანტული და კონტრადიანტული.
- ინვარიანტობა: ტიპი
List<A>არ არის ქვეტიპიList<B>-ს და პირიქით, მაშინაც კი, თუAარის ქვეტიპიB`-ს. ტიპი ზუსტად ინახება. - კოვარიანტობა (out): საშუალებას აძლევს ქვეტიპების გამოყენებას. თუ
Aარის ქვეტიპიB-ს, მაშინList<A>არისList<B>-ს ქვეტიპი. გამოიყენება გამოსავალ პარამეტრებზე.
fun foo(list: List<out Number>) {
// წაკითხვა სიიდან (Number, Double, Int და ა.შ.)
val number: Number = list[0]
// სიაში დამატება არ შეიძლება (არ არის ცნობილი, რა ტიპის ელემენტები ელოდება)
// list.add(1) // კომპილაციის შეცდომა
}
- კონტრადიანტობა (in): საშუალებას აძლევს სუპერტიპების გამოყენებას. თუ
Aარის ქვეტიპიB-ს, მაშინList<B>არისList<A>-ს ქვეტიპი. გამოიყენება შესვლის პარამეტრებზე.
fun foo(comparable: Comparable<in String>) {
// შეიძლება გადაცემა String (ან მისი სუპერტიპები)
val result = comparable.compareTo("hello")
// შედეგების მიღება არ შეიძლება (არ არის ცნობილი, რა ტიპის შედეგია)
// val str: String = comparable.compareTo("world") // კომპილაციის შეცდომა
}
Kotlin-ში ეს კონცეფციები რეალიზებულია out და in ანოტაციებით ტიპის პარამეტრებზე. Java-ში გამოიყენება wildcards (? extends და ? super).
| ტიპი | დანიშნულება | გასაღები სიტყვა (Kotlin) | Wildcard (Java) | კითხვა ნებადართული | დაწერა ნებადართული |
|---|---|---|---|---|---|
| ინვარიანტული | ზუსტი ტიპის შესაბამისობა | არა | არა | დიახ | დიახ |
| კოვარიანტული | ქვეტიპების გამოყენება (producer - "out") | out |
? extends T |
დიახ | არა |
| კონტრადიანტული | სუპერტიპების გამოყენება (consumer - "in") | in |
? super T |
არა | დიახ |