Java Generics Tutorial-czym są Generyki i jak ich używać?

Java Generics jest jedną z najważniejszych cech języka Java. Idea generyków jest dość prosta, jednak czasami wychodzi jako złożona ze względu na odejście od zwykłej składni z nią związanej.

celem tego samouczka jest wprowadzenie do tego użytecznego pojęcia leków generycznych w łatwy do zrozumienia sposób.

ale zanim zagłębimy się w generyki, zastanówmy się, dlaczego generyki Javy były w ogóle potrzebne.,

cel Generyki Javy

przed wprowadzeniem generyków w Javie 5, możesz napisać i skompilować fragment kodu w taki sposób, bez wyświetlania błędu lub ostrzeżenia:

możesz dodawać wartości dowolnego typu do listy lub innej kolekcji Javy bez konieczności deklarowania, jakiego typu dane przechowuje. Ale kiedy pobierasz wartości z listy, musisz jawnie oddać je do określonego typu.

rozważ przejrzenie powyższej listy.,

umożliwienie tworzenia listy bez uprzedniej deklaracji zapisanego typu danych, tak jak to zrobiliśmy, może spowodować, że programiści popełnią błędy, takie jak powyżej, które wyrzucąClassCastExceptions podczas działania.

Generyki zostały wprowadzone, aby uniemożliwić programistom popełnianie takich błędów.

za pomocą generics możesz jawnie zadeklarować typ danych, który będzie przechowywany podczas tworzenia kolekcji Java, Jak pokazuje poniższy przykład.,

Uwaga: nadal można utworzyć obiekt Java collection bez podawania zapisanego typu danych, ale nie jest to zalecane.

teraz nie możesz błędnie zapisać liczby całkowitej w liście typu String bez wystąpienia błędu w czasie kompilacji. Zapewnia to, że w programie nie występują błędy uruchomieniowe.

głównym celem wprowadzenia generyków do Javy było unikanie uruchamiania się ClassCastExceptions podczas wykonywania.

Tworzenie generyków Javy

możesz używać generyków do tworzenia klas i metod Javy., Przyjrzyjmy się przykładom, jak tworzyć generyki każdego typu.

Klasa generyczna

podczas tworzenia klasy generycznej parametr type dla klasy jest dodawany na końcu nazwy klasy w nawiasach <>.

tutaj,T jest parametrem typu danych. T,NorazE to niektóre z liter używanych do parametrów typu danych zgodnie z konwencjami Java.,

w powyższym przykładzie możesz przekazać mu określony typ danych podczas tworzenia obiektu GenericClass.

nie można przekazać prymitywnego typu danych do parametru typu danych podczas tworzenia ogólnego obiektu klasy. Tylko typy danych rozszerzające typ obiektu mogą być przekazywane jako parametry typu.

na przykład:

metody generyczne

Tworzenie metod generycznych przebiega według wzorca podobnego do tworzenia klas generycznych. Możesz zaimplementować metodę generyczną wewnątrz klasy generycznej, jak również inną niż generyczna.,

tutaj możesz przekazać tablicę określonego typu do parametryzacji metody. Metoda generyczna PrintItems() iteruje przez przekazaną tablicę i wypisuje elementy zapisane tak jak normalna metoda Java.

parametry typu ograniczonego

dotychczas stworzone przez nas klasy i metody generyczne mogą być parametryzowane do dowolnego typu danych innego niż typy prymitywne. Ale co, jeśli chcemy ograniczyć typy danych, które mogą być przekazywane do generycznych? W tym miejscu pojawiają się parametry typu ograniczonego.,

można powiązać typy danych akceptowane przez klasę lub metodę generyczną, określając, że powinna ona być podklasą innego typu danych.

na przykład:

tutajUpperBoundedClass IUpperBoundedMethod mogą być parametryzowane tylko za pomocą podtypów typu danychList.

List typ danych działa jako górna granica parametru type. Jeśli spróbujesz użyć typu danych, który nie jest podtypem List, spowoduje to błąd w czasie kompilacji.

granice nie ograniczają się tylko do klas., Możesz również przekazać interfejsy. Rozszerzenie interfejsu oznacza w tym przypadku implementację interfejsu.

parametr może również mieć wiele granic, takich jak ten przykład pokazuje.

akceptujący typ danych musi być podklasą klas zwierząt i ssaków. Jeśli jedna z tych granic jest klasą, musi być pierwsza w deklaracji bound.

w powyższym przykładzie, jeśli Mammal jest klasą, A zwierzę interfejsem, ssak musi być pierwszy, jak pokazano powyżej. W przeciwnym razie kod wyświetla błąd w czasie kompilacji.,

symbole wieloznaczne Java Generics

są używane do przekazywania parametrów typów generycznych metodom. W przeciwieństwie do metody generycznej, parametr generyczny jest przekazywany do parametrów akceptowanych przez metodę, która różni się od parametru typu danych omówiliśmy powyżej. Wildcard jest reprezentowany przez? symbol.

powyższa metoda printItems() przyjmuje jako parametr listy dowolnego typu danych. Uniemożliwia to programistom powtarzanie kodów dla list różnych typów danych, co miałoby miejsce bez generyków.,

symbole wieloznaczne górnej granicy

jeśli chcemy ograniczyć typy danych przechowywane na liście akceptowanej przez metodę, możemy użyć symboli wieloznacznych górnej granicy.

przykład:

printSubTypes() metoda akceptuje tylko listy, które przechowują podtypy koloru. Akceptuje listę obiektów RedColor lub BlueColor, ale nie akceptuje listy obiektów zwierzęcych. Dzieje się tak dlatego, że zwierzę nie jest podtypem koloru. Jest to przykład górnej granicy wildcard.,

dolne ograniczenie Wildcards

podobnie, gdybyśmy mieli:

to printSuperTypes() metoda akceptuje tylko listy, które przechowują super typy klasy psów. Akceptowałaby listę obiektów ssaka lub zwierzęcia, ale nie listę obiektów LabDog, ponieważ LabDog nie jest klasą nadrzędną psa, ale podklasą. Jest to przykład niższej wartości wildcard.

podsumowanie

Java Generics stała się cechą, bez której programiści nie mogą żyć od czasu jej wprowadzenia.

popularność ta wynika z jej wpływu na ułatwianie życia programistom., Inne niż zapobieganie popełnianiu błędów w kodowaniu, użycie leków generycznych sprawia, że kod jest mniej powtarzalny. Czy zauważyłeś, jak uogólnia klasy i metody, aby uniknąć konieczności powtarzania kodu dla różnych typów danych?

posiadanie dobrej znajomości generyków jest ważne, aby stać się ekspertem w języku. Tak więc, zastosowanie tego, czego nauczyłeś się w tym samouczku w praktycznym kodzie jest drogą do przodu teraz.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *