Sobes.tech
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 არა დიახ