Middle
Mis on Generics ja milleks neid kasutatakse?
sobes.tech AI
Vastus AI-lt
Generics Java võimaldab luua klasse, liideseid ja meetodeid, mis töötavad parametriseeritud tüüpidega.
Genericsi peamine eesmärk:
- Tüüpide turvalisuse tõstmine: Kompilaator kontrollib tüüpe kompileerimise ajal, vältides
ClassCastExceptionjooksvalt. - Tüüpide teisendamise eemaldamine: Ei ole vaja käsitsi teisendada tüüpe elementide saamisel kogumitest.
- Paindlikuma ja taaskasutatava koodi loomine: Võib kirjutada üldisi algoritme ja andmestruktuure, mis sobivad erinevatele andmetüüpidele.
Näide ilma Genericsita:
// Enne Java 5
import java.util.ArrayList;
import java.util.List;
public class OldStyleList {
public static void main(String[] args) {
List list = new ArrayList(); // ilma tüübita
list.add("hello");
list.add(123); // võib lisada mis tahes objekti
String s = (String) list.get(0); // tüübimuundus vajalik
Integer i = (Integer) list.get(1); // tüübimuundus vajalik
// Võimalik tüübimuundamise viga
// String error = (String) list.get(1); // ClassCastException
System.out.println(s);
System.out.println(i);
}
}
Näide Genericsiga:
// Genericsiga
import java.util.ArrayList;
import java.util.List;
public class GenericList {
public static void main(String[] args) {
List<String> list = new ArrayList<>(); // stringide nimekiri
list.add("hello");
// list.add(123); // kompileerimisel viga - ei saa lisada Integer
String s = list.get(0); // tüübimuundus pole vajalik
// Teise tüübi lisamine on võimatu, takistab viga
// List<Integer> intList = new ArrayList<>();
// intList.add("world"); // kompileerimisel viga
System.out.println(s);
}
}
Generics kasutatakse ka:
- Klassides:
ArrayList<E>,HashMap<K, V> - Liideste:
List<E>,Map<K, V> - Meetodites:
<T> void printArray(T[] array) - Tüübipiirangutes:
<T extends Comparable<T>>(piirangComparable-i rakendavatele tüüpidele)
Java implementatsioon Generics põhineb "tüüpide kustutamisel" (type erasure) kompilatsiooni ajal. See tähendab, et teave genereeritud tüüpide kohta eemaldatakse, ja jooksvalt töötab JVM puhaste tüüpidega. See tagab tagasiparandamise vanemate Java versioonidega, kuid omab teatud piiranguid.