java generics tutorial with examples
Java Generics to zestaw funkcji, które umożliwiają pisanie kodu niezależnie od typu danych. W tym artykule szczegółowo omówiono typy generyczne języka Java wraz z przykładami:
jaki jest najlepszy konwerter wideo
Typowe są jedną z ważnych funkcji języka Java i zostały wprowadzone od wersji Java 5.
Z definicji, Generics to zestaw funkcji języka Java, które pozwalają programiście używać typów i funkcji Generic, a tym samym zapewniają bezpieczeństwo typów.
Czego się nauczysz:
Jak działają generyczne w Javie?
Jeśli pracowałeś wcześniej z C ++, to Java Generics działa tak samo jak szablony w C ++. Java Generics umożliwia dołączenie parametru do definicji klasy / metody, który będzie miał wartość pierwotnego typu danych.
Na przykład, możesz mieć klasę Generic „Array” w następujący sposób:
Tablica klas {….}
Gdzie jest sparametryzowany typ.
Następnie możesz utworzyć obiekty dla tej klasy w następujący sposób:
Array int_array = new Array () Array char_array = new Array ();
Tak więc mając sparametryzowaną klasę ogólną, można tworzyć obiekty tej samej klasy z różnymi typami danych jako parametrami. To jest główna istota korzystania z generycznych Java.
Podobnie można napisać metodę ogólną z typem sparametryzowanym do sortowania tablicy, a następnie utworzyć wystąpienie tej metody dla dowolnego typu pierwotnego.
Java Generics są najczęściej używane w ramach kolekcji Java. Różne kolekcje, takie jak LinkedList, List, Map, HashMap itp., Używają do implementacji Generics. Typy generyczne zapewniają bezpieczeństwo typu, ponieważ sprawdzanie typów odbywa się w czasie kompilacji, dzięki czemu kod jest bardziej stabilny.
Przejdźmy teraz do szczegółów klas i metod generycznych, a także innych powiązanych tematów.
Klasy ogólne
Klasa ogólna jest taka sama, jak klasa normalna, z tym wyjątkiem, że po nazwie klasy występuje typ w nawiasach kątowych.
Ogólna definicja klasy Generic jest następująca:
class nazwa_klasy
{
zmienne klasowe;
…
metody klasowe;
}
Po zdefiniowaniu klasy możesz tworzyć obiekty dowolnego typu danych w następujący sposób:
class_name obj = new class_name ();
Na przykład, dla obiektu Integer deklaracja będzie wyglądać następująco:
class_name obj = new class_name;
Podobnie dla typu danych String obiekt będzie wyglądał następująco:
class_name str_Obj = new class_name;
Poniżej pokazano przykładową implementację klasy Generic.
class MyGenericClass { T obj; void add(T obj) { this.obj=obj; } T get() { return obj; } } class Main { public static void main(String args()) { MyGenericClass m_int=new MyGenericClass(); m_int.add(2); MyGenericClassmstr=new MyGenericClass(); mstr.add('SoftwaretestingHelp'); System.out.println('Member of MyGenericClass:' + m_int.get()); System.out.println('Member of MyGenericClass:' + mstr.get()); } }
Wynik:
W powyższym programie klasa MyGenericClass jest klasą generyczną. Ma dwie metody, tj. Dodaj i pobierz. Metoda add inicjuje obiekt ogólny, podczas gdy metody get zwracają obiekt.
W funkcji main deklarujemy po dwa obiekty typu Integer i String. Inicjalizujemy oba te obiekty z ich odpowiednimi wartościami początkowymi za pomocą metody add, a następnie wyprowadzamy zawartość tych obiektów za pomocą metody get.
Przedstawiliśmy powyżej przykład klasy Generic z jednym parametrem typu. Ale w rzeczywistości klasa może mieć również więcej niż jeden parametr typu. W tym przypadku parametry typu są oddzielone przecinkiem.
Poniższy przykład ilustruje to:
classTest_Generics { T1 obj1; // An object of type T1 T2 obj2; // An object of type T2 // constructor to initialise T1 & T2 objects Test_Generics(T1 obj1, T2 obj2) { this.obj1 = obj1; this.obj2 = obj2; } public void print() { System.out.println('T1 Object:' + obj1); System.out.println('T2 Object:' + obj2); } } class Main { public static void main (String() args) { Test_Genericsobj = newTest_Generics('Java Generics', 1); obj.print(); } }
Wynik:
W tym programie mamy dwa parametry typu, czyli T1 i T2. Mamy funkcje do inicjalizacji obiektów członkowskich, a także do drukowania zawartości. W funkcji main deklarujemy obiekt z dwoma typami tj. String i Integer. Dane wyjściowe programu pokazują zawartość utworzonego obiektu.
Podobnie jak w przypadku klas, możesz również mieć interfejsy ogólne. O interfejsach dowiemy się w osobnym temacie.
Metody ogólne języka Java
Tak jak możesz mieć klasy i interfejsy Generic, możesz również mieć metody Generic na wypadek, gdybyś nie potrzebował całej klasy jako Generic.
Poniższy program przedstawia implementację metody Generic „printGenericArray”. Zwróć uwagę na wywołanie metody w funkcji głównej. Tutaj wykonujemy dwa wywołania metody Generic, najpierw z typem, a następnie z typem.
public class Main{ public static void printGenericArray(T() items) { for ( T item : items){ System.out.print(item + ' '); } System.out.println(); } public static void main( String args() ) { Integer() int_Array = { 1, 3, 5, 7, 9, 11 }; Character() char_Array = { 'J', 'A', 'V', 'A', 'T','U','T','O','R','I','A', 'L','S' }; System.out.println( 'Integer Array contents:' ); printGenericArray(int_Array ); System.out.println( 'Character Array contents:' ); printGenericArray(char_Array ); } }
Wynik:
Ograniczone parametry typu
Parametry typu ograniczonego pojawiają się, gdy chcesz ograniczyć typy danych w typowych. Na przykład, jeśli chcesz, aby określona klasa ogólna lub metoda lub jakikolwiek interfejs działał tylko dla liczbowych typów danych, możesz to określić za pomocą słowa kluczowego „extends”.
Jest to pokazane poniżej:
List myList = new ArrayList(); List list1 = new ArrayList();
Powyższe dwie deklaracje zostaną zaakceptowane przez kompilator, ponieważ Long i Integer są podklasami Number.
Problemem będzie jednak kolejna deklaracja.
List list = new ArrayList();
Spowoduje to błąd w czasie kompilacji, ponieważ ciąg nie jest liczbą. Symbol „?” W powyższym przykładzie jest znany jako symbol wieloznaczny i omówimy go dalej.
Ogólnie rzecz biorąc, parametry typu ograniczonego są najczęściej używane, gdy chcesz ograniczyć typy danych, które mają być używane w kodzie ogólnym.
Java Generics Wildcard
W Javie symbol wieloznaczny jest oznaczony znakiem zapytania „?”, Który jest używany w odniesieniu do nieznanego typu. Symbole wieloznaczne są najczęściej używane w przypadku typów ogólnych jako typów parametrów.
Korzystając z ogólnych symboli wieloznacznych, należy pamiętać o jednym punkcie, że chociaż obiekt jest nadklasą wszystkich innych klas, to zbiór obiektów ( Na przykład, Lista) nie jest nadklasą wszystkich innych kolekcji.
co to jest plan testów w qa
Oprócz tego, że jest używany jako typ parametru, możesz użyć symbolu wieloznacznego jako pola, zmiennej lokalnej i jako takiej. Jednak nigdy nie można używać symbolu wieloznacznego jako nadtypu ani jako argumentu typu do wywołania metody ogólnej lub w przypadku tworzenia wystąpienia klasy ogólnej.
Istnieje wiele przykładów sparametryzowanych typów symboli wieloznacznych (tutaj przynajmniej jeden argument typu jest symbolem wieloznacznym), jak pokazano poniżej, a symbole wieloznaczne używane w różnych miejscach będą interpretowane w różny sposób:
- Kolekcja <: Kolekcja oznacza wszystkie wystąpienia interfejsu kolekcji, niezależnie od użytego argumentu typu.
- Lista extends Number< : Lista reprezentuje wszystkie typy list, w których typ elementu będzie liczbą.
- Komparator: Wszystkie wystąpienia interfejsu komparatora dla argumentów typu, które są typu Stringsupertypes.
Zwróć uwagę, że sparametryzowany typ wieloznaczny jest regułą narzuconą w celu rozpoznawania prawidłowych typów. Nie jest to konkretny typ danych. Ogólne symbole wieloznaczne mogą być ograniczone lub nieograniczone.
# 1) Nieograniczone symbole wieloznaczne
W przypadku nieograniczonych symboli wieloznacznych nie ma ograniczeń dotyczących zmiennych typu i jest oznaczony w następujący sposób:
ArrayList mylist = new ArrayList(); ArrayList my_strList = new ArrayList();
# 2) Bounded Wildcards
Omówiliśmy już typy ograniczone. Nakładają one ograniczenia na typ danych używany do tworzenia wystąpienia parametrów typu za pomocą słów kluczowych - extends lub super. Te symbole wieloznaczne można dalej podzielić na symbole wieloznaczne górne ograniczone i symbole wieloznaczne dolne ograniczone.
- Górne ograniczone symbole wieloznaczne
Jeśli chcesz, aby twoje ogólne wyrażenie było poprawne dla wszystkich podklas danego typu, określ górną granicę wieloznaczną za pomocą słowa kluczowego extends.
Na przykład, załóżmy, że potrzebujesz ogólnej metody, która obsługuje List, List, itp., wtedy możesz określić górną granicę wieloznaczną, taką jak Lista . Ponieważ Number jest nadklasą, ta ogólna metoda będzie działać dla wszystkich jej podklas.
Pokazuje to poniższy program.
importjava.util.*; public class Main { private static Number summation (List numbers){ double sum = 0.0; for (Number n : numbers) sum += n.doubleValue(); return sum; } public static void main(String() args) { //Number subtype : Integer Listint_list = Arrays.asList(1,3,5,7,9); System.out.println('Sum of the elements in int_list:' + summation(int_list)); //Number subtype : Double List doubles_list = Arrays.asList(1.0,1.5,2.0,2.5,3.0,3.5); System.out.println('Sum of the elements in doubles_list:' + summation(doubles_list)); } }
Wynik:
Tutaj podaliśmy górną granicę symbolu wieloznacznego List do argumentu typu funkcji „sumowanie”. W funkcji głównej definiujemy dwie listy tj. Int_list typu Integer oraz doubles_list typu Double. Ponieważ Integer i Double są podklasami Number, sumowanie funkcji działa doskonale na obu tych listach.
- Dolne ograniczone symbole wieloznaczne
Jeśli chcesz, aby wyrażenie ogólne akceptowało wszystkie nadklasy określonego typu, możesz określić dolną granicę wieloznaczną jako argument typu.
Przykładowa implementacja tego jest podana poniżej:
importjava.util.*; class Main { public static void main(String() args) { //Integer List ListInt_list= Arrays.asList(1,3,5,7); System.out.print('Integer List:'); printforLowerBoundedWildcards(Int_list); //Number list ListNumber_list= Arrays.asList(2,4,6,8); System.out.print('Number List:'); printforLowerBoundedWildcards(Number_list); } public static void printforLowerBoundedWildcards(List list) { System.out.println(list); } }
Wynik:
W tym programie określony symbol wieloznaczny z dolną granicą to „Lista”. Następnie w funkcji głównej mamy listę typów i listę. Ponieważ użyliśmy dolnego ograniczonego symbolu wieloznacznego, klasa Number jest nadklasą typu Integer jest poprawnym argumentem typu.
Zalety generycznych języków Java
# 1) Bezpieczeństwo typów
Typy generyczne zapewniają bezpieczeństwo typów. Oznacza to, że sprawdzanie typów odbywa się w czasie kompilacji, a nie w czasie wykonywania. Dlatego nie ma szans na uzyskanie „ClassCastException” podczas działania, ponieważ zostaną użyte prawidłowe typy.
importjava.util.*; class Main { public static void main(String() args) { List mylist = new ArrayList(); mylist.add(10); mylist.add('10'); System.out.println(mylist); List list = new ArrayList(); list.add(10); list.add('10');// compile-time error System.out.println(list); } }
W powyższym programie mamy dwie listy, jedną bez typów ogólnych, a drugą z rodzajami. Na liście nieogólnej nie ma bezpieczeństwa typów. Możesz dodać liczbę całkowitą, łańcuch itp. Jako element i jest to akceptowane.
Na liście ogólnej można dodać tylko jeden typ elementu, który jest określony w wyrażeniu ogólnym. Jeśli spróbujesz dodać element innego typu, spowoduje to błąd w czasie kompilacji.
W powyższym programie błąd kompilacji jest wyświetlany w wierszu:
list.add('10');
# 2) Możliwość ponownego wykorzystania kodu
Używając Generics, nie musisz pisać oddzielnego kodu dla każdego typu danych. Możesz napisać jedną klasę lub metodę itp. I używać jej do wszystkich typów danych.
# 3) Nie ma potrzeby typowania
Ponieważ używasz Generics, kompilator wie o używanych typach, więc nie ma potrzeby ich rzutowania.
Rozważ poniższy kod:
List mylist = new ArrayList(); mylist.add('Java'); String mystr = (String) list.get(0); //typecasting required
Jak widać, gdy używana jest normalna lista, należy przepisać element listy na odpowiedni typ, tak jak jest to zrobione dla powyższego mystr.
Teraz napiszmy ponownie ten sam kod z ogólną listą.
List list = new ArrayList(); list.add('Java'); String mystr = list.get(0);
Tutaj określiliśmy typ ciągu jako ogólne wyrażenie dla deklaracji listy. Dlatego, aby pobrać poszczególne elementy tej listy, nie musimy pisać na maszynie.
# 4) Wdrażanie algorytmów ogólnych
Możesz zaimplementować znacznie więcej algorytmów ogólnych, używając do kodowania typów ogólnych.
# 5) Sprawdzanie czasu kompilacji
Jak już wspomniano, kiedy używasz Generics w swoim programie Java, kompilator sprawdza typy w czasie kompilacji, zapobiegając w ten sposób nieprawidłowemu zakończeniu programu w czasie wykonywania.
Często Zadawane Pytania
Pytanie 1) Dlaczego używamy generycznych w Javie?
Odpowiedź: Generics zapewniają niezależność typu, tj. Możemy podać parametr typu podczas definiowania klasy / interfejsu / metody itp., Abyśmy podczas rzeczywistej instancji mogli określić rzeczywisty typ. W ten sposób zapewniamy również możliwość ponownego wykorzystania kodu.
Pytanie 2) Czy typy generyczne są ważne w Javie?
Odpowiedź: Tak. W rzeczywistości generyczne są najważniejszymi cechami Javy zapewniającymi bezpieczeństwo typów, tj. Sprawdzanie typów w czasie kompilacji.
Pytanie 3) Kiedy Java dodała Generics?
Odpowiedź: Generics zostały dodane do Java w 2004 roku wraz z J2SE 5.0 w celu zapewnienia bezpieczeństwa typów w czasie kompilacji w Javie.
P # 4) Co to jest typ ogólny?
Odpowiedź: Typ ogólny to klasa ogólna, interfejs lub metoda, która jest dostarczana z parametrem typu. Pozwala to na bezpieczeństwo typów i ponowne wykorzystanie kodu.
P # 5) Czy możemy używać typów generycznych z tablicą w Javie?
Odpowiedź: Nie. Java nie zezwala na tablice ogólne.
sql queries wywiad pytania i odpowiedzi pdf
Wniosek
Na tym kończy się samouczek dotyczący generycznych programów Java, który jest uważany za jedną z najważniejszych funkcji najnowszych wersji Java. Używanie typów generycznych w programach Java zapewnia bezpieczeństwo typów, a także ponowne wykorzystanie kodu. Zapewnia również sprawdzanie czasu kompilacji, dzięki czemu program nie ulega awarii w czasie wykonywania.
Programy generyczne Java przydają się głównie z interfejsem kolekcji Java, który omówimy szczegółowo w innym samouczku z tej serii.
Miłego czytania !!
rekomendowane lektury
- 15 najlepszych narzędzi JAVA do programowania, kompilacji, profilowania, pokrycia kodu i przeglądu
- Samouczek Java Collections Framework (JCF)
- Typy danych Java, pętle, tablice, przełączniki i asercje
- Wdrażanie Java: tworzenie i wykonywanie pliku Java JAR
- Wyjątki Java i obsługa wyjątków z przykładami
- Samouczek JAVA dla początkujących: ponad 100 praktycznych samouczków wideo Java
- Samouczek dotyczący refleksji w języku Java z przykładami
- Słowo kluczowe „this” w języku Java: samouczek z przykładami kodu