Junior
Hansı növ generikləri bilirsiniz?
sobes.tech Süni İntellekt
AI-dan cavab
Dəyişməz, kovariant və kontravariant.
- Dəyişməzlik:
List<A>tipiList<B>-nin alt tipi deyil və əksinə, həttaAB-nin alt tipi olsa belə. Tip dəqiq saxlanılır. - Kovariant (out): Alt tiplərdən istifadə etməyə imkan verir.
List<A>AB-nin alt tipi olarsa,List<B>-nin alt tipidir. Çıxış parametrləri üçün istifadə olunur.
fun foo(list: List<out Number>) {
// Listədən oxumaq olar (Number, Double, Int və s.)
val number: Number = list[0]
// Listəyə əlavə etmək olmaz (hansı tip elementlərin gözlənildiyi məlum deyil)
// list.add(1) // Tərtib səhvi
}
- Kontravariantiya (in): Super tiplərdən istifadə etməyə imkan verir.
List<B>A-nın alt tipi olarsa,List<A>-nın alt tipidir. Giriş parametrləri üçün istifadə olunur.
fun foo(comparable: Comparable<in String>) {
// String və ya onun super tiplərini arqument kimi keçirmək olar
val result = comparable.compareTo("hello")
// String tipli nəticələr əldə etmək olmaz (hansı tip nəticə olduğu məlum deyil)
// val str: String = comparable.compareTo("world") // Tərtib səhvi
}
Kotlin-də bu anlayışlar out və in annotasiyaları ilə parametr tiplərində həyata keçirilir. Java-da isə wildcards (? extends və ? super) istifadə olunur.
| Tip | Məqsəd | Açar söz (Kotlin) | Wildcard (Java) | Oxumağa icazə verilir | Yazmağa icazə verilir |
|---|---|---|---|---|---|
| Dəyişməz | Tipin dəqiq uyğunluğu | Yox | Yox | Bəli | Bəli |
| Kovariant | Alt tiplərin istifadəsi (istehsalçı - "out") | out |
? extends T |
Bəli | Yox |
| Kontravariant | Super tiplərin istifadəsi (istehlakçı - "in") | in |
? super T |
Yox | Bəli |