Middle
Kādas iespējas ir Generics?
sobes.tech AI
Atbilde no AI
Ģeneriki ļauj izveidot parametrizētās klases, interfeisus un metodes.
Galvenās iespējas:
- Koda atkārtota izmantošana: Izveidot universālas datu struktūras un algoritmus, kas darbojas ar jebkādiem tipiem.
- Tipu drošība kompilācijas laikā: Tipu kļūdas tiek atklātas kompilācijas laikā, nevis izpildes laikā. Tas novērš nepieciešamību manuāli veikt tipu pārveidošanu un saistītās potenciālās kļūdas
ClassCastException. - Lasāmības uzlabošana: Kods kļūst skaidrāks, jo skaidri norāda, ar kādiem tipiem tas strādā.
Piemēri:
List<T>klase var glabāt jebkāda tipaTelementus.static <T> T getFirst(List<T> list)metode var atgriezt pirmo elementu no jebkāda tipa saraksta.
Generiku ierobežojumi:
- Nav iespējams izveidot ģeneriskā tipa eksemplāru:
new T(). - Nav iespējams izmantot primitivus tipus kā tipu parametrus (piemēram,
List<int>- nepareizi, jābūtList<Integer>). - Nav iespējams tieši izveidot ģenerisku tipu masīvus (piemēram,
T[] array = new T[10]- nepareizi, jāizmantoArrayListvai tipu pārveidošana). - Nav iespējams tieši izmantot statiskos laukus ar ģeneriskiem tipiem.
- Informācija par tipiem tiek izdzēsta izpildes laikā (Type Erasure), izņemot bounded wildcards.
Wildcards un bounded Type Parameters:
<?>: Nezināms tips. Atļauj lasīt elementus, bet ne rakstīt.<? extends T>: Augšējā robeža. Atļauj strādāt ar tipiem, kas irTsubtipi. Var lasītTvai tā supertipu elementus, bet nevar rakstīt (izņemotnull).<? super T>: Apakšējā robeža. Atļauj strādāt ar tipiem, kas irTsupertipi. Var rakstītTvai tā subtipu elementus, bet var lasīt tikaiObjecttipus.
Piemērs:
// Metode, kas var izdrukāt elementus no jebkura saraksta,
// kas satur `Number` subtipus
public static void printNumbers(List<? extends Number> list) {
for (Number n : list) {
System.out.println(n);
}
// list.add(new Integer(1)); // Kompilācijas kļūda
}
// Metode, kas var pievienot `Integer` sarakstam,
// kas satur `Integer` vai tā supertipus
public static void addIntegers(List<? super Integer> list) {
list.add(new Integer(10));
// Integer val = list.get(0); // Kompilācijas kļūda, atgriež `Object`
}