logo

Generics w Javie

Genetyki oznacza typy sparametryzowane . Pomysł polega na tym, aby typ (liczba całkowita, ciąg znaków itp. oraz typy zdefiniowane przez użytkownika) był parametrem metod, klas i interfejsów. Używając Generics, możliwe jest tworzenie klas, które działają z różnymi typami danych. Jednostka, taka jak klasa, interfejs lub metoda, która działa na sparametryzowanym typie, jest jednostką ogólną.

Dlaczego leki generyczne?

The Obiekt jest nadklasą wszystkich innych klas, a odwołanie do obiektu może odnosić się do dowolnego obiektu. Cechom tym brakuje bezpieczeństwa typu. Generics dodają tego typu funkcję bezpieczeństwa. Omówimy ten typ zabezpieczenia w późniejszych przykładach.



Generics w Javie są podobne do szablonów w C++. Na przykład klasy takie jak HashSet, ArrayList, HashMap itp. Bardzo dobrze wykorzystują typy generyczne. Istnieją pewne zasadnicze różnice między tymi dwoma podejściami do typów ogólnych.

Rodzaje języków generycznych Java

Metoda ogólna: Ogólna metoda Java pobiera parametr i zwraca pewną wartość po wykonaniu zadania. Działa dokładnie tak samo jak normalna funkcja, jednak metoda ogólna ma parametry typu, które są cytowane przez rzeczywisty typ. Dzięki temu metoda ogólna może być stosowana w bardziej ogólny sposób. Kompilator dba o rodzaj bezpieczeństwa, który umożliwia programistom łatwe kodowanie, ponieważ nie muszą wykonywać długich, indywidualnych rzutowań typów.

Klasy ogólne: Klasa generyczna jest implementowana dokładnie tak samo, jak klasa nieogólna. Jedyna różnica polega na tym, że zawiera sekcję parametrów typu. Może istnieć więcej niż jeden typ parametru, oddzielonych przecinkiem. Klasy, które akceptują jeden lub więcej parametrów, nazywane są klasami sparametryzowanymi lub typami sparametryzowanymi.



Klasa ogólna

Podobnie jak w C++, używamy do określania typów parametrów podczas tworzenia klasy ogólnej. Aby utworzyć obiekty klasy ogólnej, używamy następującej składni.

// To create an instance of generic class BaseType obj = new BaseType ()>

Notatka: W typie parametru nie możemy używać prymitywów takich jak „int”, „char” lub „double”.

Jawa






// Java program to show working of user defined> // Generic classes> // We use to specify Parameter type> class> Test {> >// An object of type T is declared> >T obj;> >Test(T obj) {>this>.obj = obj; }>// constructor> >public> T getObject() {>return> this>.obj; }> }> // Driver class to test above> class> Main {> >public> static> void> main(String[] args)> >{> >// instance of Integer type> >Test iObj =>new> Test(>15>);> >System.out.println(iObj.getObject());> >// instance of String type> >Test sObj> >=>new> Test(>'GeeksForGeeks'>);> >System.out.println(sObj.getObject());> >}> }>

>

>

Wyjście

15 GeeksForGeeks>

Możemy także przekazywać wiele parametrów typu w klasach ogólnych.

Jawa

jak przekonwertować ciąg na liczbę całkowitą Java




// Java program to show multiple> // type parameters in Java Generics> // We use to specify Parameter type> class> Test> {> >T obj1;>// An object of type T> >U obj2;>// An object of type U> >// constructor> >Test(T obj1, U obj2)> >{> >this>.obj1 = obj1;> >this>.obj2 = obj2;> >}> >// To print objects of T and U> >public> void> print()> >{> >System.out.println(obj1);> >System.out.println(obj2);> >}> }> // Driver class to test above> class> Main> {> >public> static> void> main (String[] args)> >{> >Test obj => >new> Test(>'GfG'>,>15>);> >obj.print();> >}> }>

>

>

Wyjście

GfG 15>

Funkcje ogólne:

Możemy także pisać funkcje ogólne, które można wywoływać z różnymi typami argumentów w zależności od typu argumentów przekazanych do metody ogólnej. Kompilator obsługuje każdą metodę.

Jawa




// Java program to show working of user defined> // Generic functions> class> Test {> >// A Generic method example> >static> >void> genericDisplay(T element)> >{> >System.out.println(element.getClass().getName()> >+>' = '> + element);> >}> >// Driver method> >public> static> void> main(String[] args)> >{> >// Calling generic method with Integer argument> >genericDisplay(>11>);> >// Calling generic method with String argument> >genericDisplay(>'GeeksForGeeks'>);> >// Calling generic method with double argument> >genericDisplay(>1.0>);> >}> }>

>

>

Wyjście

java.lang.Integer = 11 java.lang.String = GeeksForGeeks java.lang.Double = 1.0>

Typy ogólne działają tylko z typami referencyjnymi:

Kiedy deklarujemy instancję typu ogólnego, argument typu przekazany do parametru typu musi być typem referencyjnym. Nie możemy używać prymitywnych typów danych, takich jak wew , zwęglać.

Test obj = new Test(20);>

Powyższa linia powoduje błąd w czasie kompilacji, który można rozwiązać za pomocą opakowań typów w celu hermetyzacji typu pierwotnego.

nazwa produktów do makijażu

Ale tablice typu pierwotnego można przekazać do parametru typu, ponieważ tablice są typami referencyjnymi.

ArrayList a = new ArrayList();>

Typy ogólne różnią się w zależności od argumentów typu:

Rozważ następujący kod Java.

Jawa




// Java program to show working> // of user-defined Generic classes> // We use to specify Parameter type> class> Test {> >// An object of type T is declared> >T obj;> >Test(T obj) {>this>.obj = obj; }>// constructor> >public> T getObject() {>return> this>.obj; }> }> // Driver class to test above> class> Main {> >public> static> void> main(String[] args)> >{> >// instance of Integer type> >Test iObj =>new> Test(>15>);> >System.out.println(iObj.getObject());> >// instance of String type> >Test sObj> >=>new> Test(>'GeeksForGeeks'>);> >System.out.println(sObj.getObject());> >iObj = sObj;>// This results an error> >}> }>

>

>

Wyjście:

error: incompatible types: Test cannot be converted to Test>

Mimo że iObj i sObj są typu Test, stanowią one odniesienia do różnych typów, ponieważ ich parametry typu różnią się. Generics zwiększają w ten sposób bezpieczeństwo typu i zapobiegają błędom.

Wpisz parametry w języku ogólnym Java

Konwencje nazewnictwa parametrów typu są ważne, aby dokładnie poznać parametry generyczne. Typowe parametry typu są następujące:

lista ciągów Java
  • T – Typ
  • E – Element
  • K – Klucz
  • N – Liczba
  • V – Wartość

Zalety leków generycznych:

Programy korzystające z kodu generycznego mają wiele zalet w porównaniu z kodem nieogólnym.

1. Ponowne wykorzystanie kodu: Możemy raz napisać metodę/klasę/interfejs i użyć jej do dowolnego typu.

2. Typ bezpieczeństwa: Generics powodują, że błędy pojawiają się w czasie kompilacji, a nie w czasie wykonywania (zawsze lepiej jest wiedzieć o problemach w kodzie w czasie kompilacji, niż powodować awarię kodu w czasie wykonywania). Załóżmy, że chcesz utworzyć ArrayList przechowującą nazwiska uczniów i jeśli programista przez pomyłkę doda obiekt typu całkowitego zamiast łańcucha, kompilator na to pozwala. Jednak gdy pobieramy te dane z ArrayList, powoduje to problemy w czasie wykonywania.

Jawa




// Java program to demonstrate that NOT using> // generics can cause run time exceptions> import> java.util.*;> class> Test> {> >public> static> void> main(String[] args)> >{> >// Creatinga an ArrayList without any type specified> >ArrayList al =>new> ArrayList();> >al.add(>'Sachin'>);> >al.add(>'Rahul'>);> >al.add(>10>);>// Compiler allows this> >String s1 = (String)al.get(>0>);> >String s2 = (String)al.get(>1>);> >// Causes Runtime Exception> >String s3 = (String)al.get(>2>);> >}> }>

>

>

Wyjście :

Exception in thread 'main' java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String at Test.main(Test.java:19)>

Jak leki generyczne rozwiązują ten problem?

Definiując ArrayList, możemy określić, że ta lista może przyjmować tylko obiekty typu String.

Jawa




// Using Java Generics converts run time exceptions into> // compile time exception.> import> java.util.*;> class> Test> {> >public> static> void> main(String[] args)> >{> >// Creating a an ArrayList with String specified> >ArrayList al =>new> ArrayList ();> >al.add(>'Sachin'>);> >al.add(>'Rahul'>);> >// Now Compiler doesn't allow this> >al.add(>10>);> >String s1 = (String)al.get(>0>);> >String s2 = (String)al.get(>1>);> >String s3 = (String)al.get(>2>);> >}> }>

>

>

lista Javy

Wyjście:

15: error: no suitable method found for add(int) al.add(10); ^>

3. Indywidualny odlew typu nie jest potrzebny: Jeśli nie używamy typów generycznych, to w powyższym przykładzie za każdym razem, gdy pobieramy dane z ArrayList, musimy je wpisać. Typowanie przy każdej operacji pobierania powoduje duży ból głowy. Jeśli już wiemy, że nasza lista zawiera tylko dane w formie ciągów znaków, nie musimy jej za każdym razem rzutować na typ.

Jawa




// We don't need to typecast individual members of ArrayList> import> java.util.*;> class> Test {> >public> static> void> main(String[] args)> >{> >// Creating a an ArrayList with String specified> >ArrayList al =>new> ArrayList();> >al.add(>'Sachin'>);> >al.add(>'Rahul'>);> >// Typecasting is not needed> >String s1 = al.get(>0>);> >String s2 = al.get(>1>);> >}> }>

>

>

4. Generics promuje możliwość ponownego wykorzystania kodu: Za pomocą generycznych w Javie możemy napisać kod, który będzie działał z różnymi typami danych. Na przykład,

Załóżmy, że chcemy posortować elementy tablicy różnych typów danych, takich jak int, char, String itp.

Zasadniczo będziemy potrzebować różnych funkcji dla różnych typów danych.

Dla uproszczenia użyjemy sortowania bąbelkowego.

Ale używając leki generyczne, możemy osiągnąć funkcję ponownego użycia kodu.

Jawa




public> class> GFG {> >public> static> void> main(String[] args)> >{> >Integer[] a = {>100>,>22>,>58>,>41>,>6>,>50> };> >Character[] c = {>'v'>,>'g'>,>'a'>,>'c'>,>'x'>,>'d'>,>'t'> };> >String[] s = {>'Virat'>,>'Rohit'>,>'Abhinay'>,>'Chandu'>,>'Sam'>,>'Bharat'>,>'Kalam'> };> >System.out.print(>'Sorted Integer array : '>);> >sort_generics(a);> >System.out.print(>'Sorted Character array : '>);> >sort_generics(c);> >System.out.print(>'Sorted String array : '>);> >sort_generics(s);> > >}> >public> static> extends Comparable>void sort_generics(T[] a) { //Porównując nieprymitywne typy danych //musimy użyć logiki klasy Comparable //Logika sortowania bąbelkowego for (int i = 0; i 1; i++) { for (int j = 0; jot 1; j++) { if (a[j].compareTo(a[j + 1])> 0) { zamiana(j, j + 1, a); } } } // Drukowanie elementów po posortowaniu for (T i : a) { System.out.print(i + ', '); } System.out.println(); } public static void swap(int i, int j, T[] a) { T t = a[i]; a[i] = a[j]; a[j] = t; } }>

>

matryca lateksowa
>

Wyjście

Sorted Integer array : 6, 22, 41, 50, 58, 100, Sorted Character array : a, c, d, g, t, v, x, Sorted String array : Abhinay, Bharat, Chandu, Kalam, Rohit, Sam, Virat,>

Tutaj stworzyliśmy metodę generyczną. Tej samej metody można używać do wykonywania operacji na danych całkowitych, danych łańcuchowych i tak dalej.

5. Implementacja algorytmów ogólnych: Używając generycznych, możemy zaimplementować algorytmy, które działają na różnych typach obiektów, a jednocześnie są bezpieczne dla typów.