Geneerilised tüübid Flashcards
Geneetiline tüüp — T___p___ter, mida t___kse <T>
, kus T on m___ta ___, mida saab asendada k___te t___ga, mis tehakse, kui m___t või k___ kasutatakse.
Tüübiparameeter, mida tähistatakse <T>
, kus T on määramata tüüp, mida saab asendada konkreetsete tüüpidega, mis tehakse, kui meetodit või klassi kasutatakse.
Geneeriliste tüüpide eelised (tõhusus, turvalisus)
Geneerilised tüübid võimaldavad kirjutada taaskasutatavaid klasse ja meetodeid, mis töötavad eri andmetüüpidega. Kood on tüübikindel, vähem vastuvõtlik tüübi vigadele, lihtsam lugeda ja tüübivead tulevad välja juba enne programmi jooksmist.
Geneeriliste tüüpide kasutamine andmestruktuurides ja meetodites
Geneerilisi tüüpe saab kasutada:
1. Liideses (interface MyInterface<T> {...}
)
2. Klassis (class Box<T> {...}
)
3. Konstruktoris (public Box(T item) {...}
)
4. Muutuja tüübina (List<String> stringList
)
5. Meetodis (public <T> void print(T param) {...}
)
Geneeriliste tüüpide piirangud (tõhusus, turvalisus)
Type erasure___
Instanceof___List<String> strings
ja List<Integer> integers
___
Primitiivtüübid (List<int>
)__
Staatilised kontekstid___
Type erasure — jooksuajal tüübiteave kustutatakse.
Näiteks ArrayList List<String>
tüübi printimisel ütleb lihtsalt, et see on ArrayList, ja sealt ei tule välja, et see sisaldab Stringe.
Ja instanceof
kontrolle tehes ei saa küsida, kas on List<String>
, peab küsima kas on List<?>
.List<String> strings
ja List<Integer> integers
klasse võetakse ühesuguselt kui ArrayListi.
Geneeriline tüüp ei saa olla primitiivtüüp (List<int>
).
Staatilistes kontekstides ei ole võimalik kasutada määramata tüüpi T.
Kuidas saab geneerilist tüüpi kasutada
1. Liideses?
interface MyInterface<T> {...}
Kuidas saab geneerilist tüüpi kasutada
2. Klassis?
class Box<T> {...}
Kuidas saab geneerilist tüüpi kasutada
3. Konstruktoris?
public Box(T item) {...}
Kuidas saab geneerilist tüüpi kasutada
4. Muutuja tüübina?
List<String> stringList
Kuidas saab geneerilist tüüpi kasutada
5. Meetodis?
public <T> void print(T param) {...}