Sobes.tech
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 ClassCastException jooksvalt.
  • 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>> (piirang Comparable-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.