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ípusList<B>-nek, és fordítva, még akkor sem, haAal-típusB-nek. A típus pontosan megmarad. - Kovariáns (out): Lehetővé teszi az al-típusok használatát.
List<A>al-típusList<B>-nek, haAal-típusB-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ípusList<A>-nak, haAal-típusB-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 |