Sobes.tech
Middle

Kādas iespējas sniedz Generics Java?

sobes.tech AI

Atbilde no AI

Generics Java valodā uzlabo koda tipu drošību, novēršot izpildlaika kļūdas, kas saistītas ar tipu pārveidošanu. Galvenās iespējas:

  • Tipu pārbaude kompilācijas laikā: Kompilators pārbauda, vai ir pareizi izmantoti Generics norādītie tipi, kas ļauj identificēt kļūdas pirms programmas palaišanas.

    // Bez Generics - iespējama ClassCastException
    List list = new ArrayList();
    list.add("rinda");
    list.add(123); // Pievieno Integer
    String s = (String) list.get(1); // Izpildlaika kļūda
    
    // Ar Generics - kompilēšanas kļūda
    List<String> stringList = new ArrayList<>();
    stringList.add("rinda");
    // stringList.add(123); // Kompilēšanas kļūda
    String str = stringList.get(0); // Droša saņemšana
    
  • Tipu pārveidojumu novēršana (type casting): Generics novērš nepieciešamību pēc tieša tipu pārveidojuma, iegūstot elementus no kolekcijām vai izmantojot parametrizētus klases.

    // Bez Generics
    List list = new ArrayList();
    list.add("Sveiki");
    String s = (String) list.get(0); // Tiešais pārveidojums
    
    // Ar Generics
    List<String> stringList = new ArrayList<>();
    stringList.add("Sveiki");
    String str = stringList.get(0); // Pārveidojums nav nepieciešams
    
  • Vispārīga koda realizācija (Generics Methods, Generics Classes, Generics Interfaces): Ļauj izveidot vispārīgas algoritmus un datu struktūras, kas strādā ar dažādiem tipiem, ne dublējot kodu.

    // Vispārīgs metode masīva drukāšanai
    public static <T> void printArray(T[] array) {
        for (T element : array) {
            System.out.print(element + " ");
        }
        System.out.println();
    }
    
    // Vispārīgs klases - pāris vērtību
    class Pair<K, V> {
        private K key;
        private V value;
    
        public Pair(K key, V value) {
            this.key = key;
            this.value = value;
        }
    
        public K getKey() { return key; }
        public V getValue() { return value; }
    }
    
  • Wildcards atbalsts: Ļauj definēt elastīgas ierobežojumus tipiem parametrizētajos tipos.

    • ? (Neierobežots Wildcard): jebkurš tips.
    • ? extends T (Augšējās robežas Wildcard): tips ir T vai tā apakštips.
    • ? super T (Zemākās robežas Wildcard): tips ir T vai tā supertips.
    // Metode, kas pieņem jebkura tipa sarakstu
    public static void processList(List<?> list) {
        // ...
    }
    
    // Metode, kas pieņem skaitļu sarakstu vai to apakštipus
    public static void processNumbers(List<? extends Number> list) {
        // ...
    }
    
    // Metode, kas pieņem virknes sarakstu vai to supertipus
    public static void addStrings(List<? super String> list) {
        list.add("jauna rinda");
    }
    
  • Izmantošana kolekciju ietvarā: Visas galvenās kolekciju klases (List, Set, Map u.c.) ir parametrizētas, kas padara darbu ar kolekcijām tipa drošu un ērtu.

Generics ir mūsdienu Java būtisks elements, kas uzlabo koda uzticamību un lasāmību.