muzruno.com

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

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

java generics description

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

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

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

общ клас Java

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

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

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

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

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

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

java generic

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

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

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

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

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



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

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

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

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

Това е обща техника. Такива ограничения често се използват, за да се осигури съвместимост на типови параметри в един и същи клас. Обмислете пример за класа на двойката ни: чифт клас. Тук казваме на компилатора, че тип Т може да бъде произволен, а тип V трябва да е тип T или една от неговите подкласове.

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

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

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

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

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

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

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

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

цяло число

низ

Споделяне в социалните мрежи:

сроден