/ / Java Generics: описание и методи

Java Generics: Описание и методи

От самото появяване на езика Java е претърпялмного промени, които несъмнено донесоха положителни моменти в неговата функционалност. Една такава значима промяна е въвеждането на Java Generic или обобщение. Тази функционалност направи езика не само по-гъвкав и гъвкав, но и много по-безопасен от гледна точка на намаляването на типовете данни.

java generics description

Факт е, че преди въвеждането на генерични родовикод в Java може да бъде създаден само чрез препратка към типа обект. Такива връзки могат да бъдат присвоени на всеки обект. В крайна сметка всички класове в Java са имплицитни потомци на класа Object. Този подход обаче е потенциален източник на много грешки при типовата безопасност, когато изрично преобразувате обект от обект в тип на насочването. Когато се използват генерализации, всички отливки се изпълняват имплицитно и автоматично, което изключва дори възможността за възникване на грешки.

Java Generics: описание и пример

Да вземем един прост пример за прилагане на обобщението на обичайния клас на фигурата по-долу. И едва тогава ще преминем към подробен преглед на всички тънки нюанси и нюанси на Java Generic.

общ клас Java

Забележете какОбявяване на клас двойка. Веднага след името на класа, отворени ъглови скоби, които са посочени буквата Т. Това е един вид на пълнител, който е в процес на създаване на модел на този клас ще бъде заменен от определен тип. Изглежда, както следва: Двойка <цяло число> OBJ = нов чифт <цяло число> (). Трябва да се отбележи, че вместо Т да посочите всяка буква, но като правило, използвайте T, V или E.

Забележка: като се започне с осмата версия на Java, посочвайки типа на целевата група, когато връзката е декларирана, можете да оставяте ъгловите скоби в конструктора празни. Така че горният пример може да бъде пренаписан както следва: Pair <Integer> obj = new Pair <> ().

Когато класът е обявен по този начин, то тогава в негоМожете да използвате това писмо вместо конкретни типове полета, препратки и методи, върнати по методи. Тъй като T е заменен от конкретен тип при създаването на клас обект, първото и второто поле в този случай ще бъдат от тип Integer.

Следвайки логиката, аргументите firstItem и secondItem,предаден на съответния конструктор, трябва да бъде от тип Integer или неговата подклас. Ако се опитате да предава тип данни, който е различен от това, което е било посочено при създаване на обект, компилаторът няма да остави тази грешка. По този начин, когато аргументи конструктора обект ще бъде както следва: Двойка <цяло число> OBJ = нов чифт <> (нов цяло число (1), нов цяло число (2)). Същото важи и за аргументите за методите setFirst и setSecond. И както вероятно сте се досетили, методи getFirst getSecond и ще върне стойност от тип Integer.

Общ клас с няколко типа параметри

В общите класове можете също така да декларирате няколко типа параметри, които са посочени в ъглови скоби, разделени със запетаи. Класът на двойката за този случай е представен на фигурата по-долу.

java generic

Както можете да видите, когато създавате пример за такъв класВ ъгловите скоби трябва да посочите същия брой типове като параметрите. Ако сте запознати с такава структура от данни като Карта, тогава може да забележите, че там се използва същия принцип. Първият аргумент определя типа ключ, а вторият - типът на стойността. Следва да се отбележи, че видовете аргументи, предадени на създаването на обект, могат да бъдат еднакви. Така че, следната декларация за пример на класа на двойката е абсолютно правилна: Pair <String, String> obj.

Някои характеристики на обобщенията

Преди да продължим, трябва да отбележим товаКомпилаторът на Java не създава различни версии на класа на двойката. Всъщност по време на процеса на компилиране цялата информация за генеричния тип се заличава. Вместо това се излъчват съответните типове, създавайки специална версия на класа на двойката. Самата програма обаче все още има една генерализирана версия на този клас. Този процес се нарича Java чист тип.

Нека да отбележим важна точка. Препратките към различни версии на същия общ клас на Java не могат да сочат към същия обект. Тоест, да речем, че имаме два линка: Pair <Integer> obj1 и Pair <Double> obj2. Поради това възниква грешка в реда obj1 = obj2. Въпреки че двете променливи са от тип Pair <T>, обектите, за които се отнасят, са различни. Това е ярък пример за сигурността на типовете в Java Generic.

Ограничения, наложени на общите класове

Важно е да знаете, че генерализациите могат да бъдат приложенисамо за референтни типове, т.е. аргументът, предаван на аргумента за параметъра "общи" клавишни java, трябва да бъде тип на класа. Такива прости типове, като например двойни или дълги, не могат да бъдат предавани. С други думи, следният ред от декларацията за класа на двойката не е валиден: Pair <int> obj. Обаче това ограничение не е сериозен проблем, тъй като Java има съответстващ клас обвивка за всеки примитивен тип. Строго погледнато, ако двойката клас искате да побере в себе си число и Булева стойност avtoupakovka прави всичко за вас: Чифт <Integer, Булева> OBJ = нов чифт <> (25, вярно).

Друго сериозно ограничение еневъзможност за създаване на инстанция на тип параметър. Така че следният ред ще доведе до компилационна грешка: T first = new T (). Това е очевидно, тъй като не знаете предварително дали един пълен клас или абстрактни интерфейс ще бъде приет като аргумент. Същото важи и за създаването на масиви.

Ограничени типове

Често има ситуации, когатоНеобходимо е да се ограничи списъкът на типовете, които могат да бъдат предадени като аргумент в класа на Java. Нека предположим, че в нашия клас Pair искаме да включим само числени стойности за допълнителни математически операции върху тях. За да направите това, трябва да зададете горната граница на типа параметър. Това се изпълнява, като се използва декларация завръхклас, наследена от всички аргументи, предавани в ъглови скоби. Той ще изглежда така: клас Pair <T разширява номера>. По този начин компилаторът научава, че вместо параметъра Т можете да замените класа Брой или една от неговите подкласове.

Това е обща техника. Такива ограничения често се използват за осигуряване параметри тип съвместимост в един и същи клас. Да разгледаме пример в нашия клас Pair: клас Pair <T, V простира T>. Тук ние каже на компилатора, че тип T може да бъде произволно, и V тип трябва да бъде или от тип Т или една от неговите подкласове.

Ограничението "отдолу" се случва точно същотоизображение, но вместо думата се простира, думата супер е написана. Това означава, че декларирането на клас Pair <T super ArrayList> показва, че вместо T, може да се замести или ArrayList, или който и да е клас или интерфейс, който наследява.

Общи методи на Java и конструктори

В Java обобщенията могат да се прилагат не само по отношение на класовете, но и по методите. Така общият метод може да бъде обявен в обикновения клас.

общи методи за Java

Както можете да видите на фигурата по-горе, няма нищо сложно в обявяването на генерализирания метод. Достатъчно е да поставите ъглови скоби преди метода тип връщане и да зададете типови параметри в тях.

В случая на конструктора всичко се прави по същия начин:

java генеричен тип почистване

В този случай ъгловите скоби се поставят пред името на конструктора, тъй като не връща никаква стойност. Резултатът от работата на двете програми ще бъде:

цяло число

низ

Прочетете повече: