Sobes.tech
Junior

Milyen generikus típusokat ismersz?

sobes.tech MI

Válasz az MI-től

Változatlan, kovariáns és kontravariáns.

  • Változatlanság: A List<A> típus nem al-típus List<B>-nek, és fordítva, még akkor sem, ha A al-típus B-nek. A típus pontosan megmarad.
  • Kovariáns (out): Lehetővé teszi az al-típusok használatát. List<A> al-típus List<B>-nek, ha A al-típus B-nek. Kimeneti paraméterekhez (visszatérési értékekhez) használják.
fun foo(list: List<out Number>) {
    // Olvashatunk a listából (Number, Double, Int stb.)
    val number: Number = list[0]
    // Nem adhatunk hozzá a listához (nem tudjuk, milyen típusú elemeket várnak)
    // list.add(1) // Fordítási hiba
}
  • Kontravariáns (in): Lehetővé teszi a supertípusok használatát. List<B> al-típus List<A>-nak, ha A al-típus B-nek. Bemeneti paraméterekhez (argumentumokhoz).
fun foo(comparable: Comparable<in String>) {
    // String vagy supertípusai argumentumként átadhatók
    val result = comparable.compareTo("hello")
    // Nem lehet String típusú eredményeket kapni (nem tudjuk, milyen típusú eredmény)
    // val str: String = comparable.compareTo("world") // Fordítási hiba
}

Kotlinben ezeket a fogalmakat az out és in annotációkkal valósítják meg a típusparamétereken. Java-ban wildcards (? extends a kovarianciához és ? super a kontravarianciához) használatosak.

Típus Cél Kulcsszó (Kotlin) Wildcard (Java) Olvasás engedélyezett Írás engedélyezett
Változatlan Pontos típusegyezés Nem Nem Igen Igen
Kovariáns Al-típusok használata (gyártó - "out") out ? extends T Igen Nem
Kontrariáns Super-típusok használata (fogyasztó - "in") in ? super T Nem Igen