Sobes.tech
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> tipi List<B>-nin alt tipi deyil və əksinə, hətta A B-nin alt tipi olsa belə. Tip dəqiq saxlanılır.
  • Kovariant (out): Alt tiplərdən istifadə etməyə imkan verir. List<A> A B-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 outin annotasiyaları ilə parametr tiplərində həyata keçirilir. Java-da isə wildcards (? extends? 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