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

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

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


Java Синтез: описание и примери

Нека разгледаме един прост пример за обобщение на нормална клас долу. И тогава ще пристъпим към подробно разглеждане на всички нюанси и нюанси на Java Generic.
Обърнете внимание на това как се прави декларацията за двойката. Веднага след име клас отворен ъгъл скоби, които са посочени буквата Т. Това е един вид на пълнител, който е в процес на създаване на модел на този клас ще бъде заменен от определен тип. Изглежда така: Pair obj = new Pair (). Трябва да се отбележи, че вместо T можете да посочите всяка буква, но по правило,използвайте T, V или E.


Забележка: като се започне с осмата версия на Java, като се определи типа на целта при деклариране на връзката, ъгловите скоби в конструктора могат да останат празни. Така горният пример може да бъде презаписан по следния начин: Pair obj = new Pair & lt; & gt; (). Когато клас е обявен по този начин, можете да използвате това писмо в неговото тяло вместо специфични типове полета, връзки и методи за връщане на обекти. Тъй като Т, когато обект от клас се замени с определен тип, първото и второто поле в този случай ще имат тип цяло число. Следвайки логиката, аргументите firstItem и secondItem, предадени на съответния конструктор, също трябва да имат тип Integer или неговите подкласове. Ако се опитате да изпратите тип данни, който се различава от указаното при създаването на обект, компилаторът няма да пропусне тази грешка. Така че конструкторът с аргументи при създаването на обект ще изглежда така: Pair obj = new Pair & lt; & gt; (ново цяло число

, ново цяло число

). Същото се отнася и за методите setFirst и setSecond. И както вероятно сте се досетили, getFirst и getSecond ще върнат цяло число.

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

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

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

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

Граници, наложени на обобщени класове

Важно е да се знае, че обобщенията могат да се прилагат само за референтни типове, тоест, то се предава на общия аргумент java клас, аргументът задължително трябва да е от типа на класа. Такива прости типове, като например, или дълги двойни, не могат да се предават. С други думи, следната линия за деклариране на клас Pare е невалидна: Pair obj. Това ограничение обаче не представлява сериозен проблем, както в Java за всичкиПримитивният тип е съответната shell-класа. Строго погледнато, ако искате да капсулирате цялата и логическа стойност в класа Pair, автоматичното опаковане ще направи всичко за вас: Pair obj = new Pair & lt; & gt; (25 вярно).
Едно по-сериозно ограничение е невъзможността за създаване на инстанция на тип параметър. Така че, следният ред ще предизвика грешка при компилирането: T първо = ново T (). Това е очевидно, защото не знаете предварително дали аргументът се предава на пълноправен клас или абстрактно, или изцяло интерфейс. Същото се отнася и за създаването на масиви.

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

Много често има ситуации, в които трябва да ограничите списъка от типове, които могат да се предават като генеричен аргумент java. Да предположим, че в нашия клас Pair искаме да инкапсулираме само числови стойности за по-нататъшни математически операции над тях. За да направите това, трябва да определим горната граница на параметъра тип. Това се реализира с помощта на обявяването на суперклас, който се наследява от всички аргументи, предавани в ъглови скоби. Това ще изглежда така: клас Pair. По този начин компилаторът научава, че вместо параметъра T може да се замени или класа Number, или един от неговите подкласове. Това е обща рецепция. Тези ограничения често се използват, за да се гарантира съвместимостта на параметри от тип в същия клас. Помислете за пример в нашата двойка класове чифт: чифт клас. Тук казваме на компилатора, че тип Т може да бъде произволен, а тип V задължително трябва да е от тип Т или един от неговите подкласове. "Долното" ограничение е точно същото, но вместо думите разширения, думата е написанасупер. Това означава, че декларацията на класа Pair казва, че вместо T, може да бъде заменен ArrayList, или всеки клас или потребител, който той използва.

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

В Java обобщенията могат да се прилагат не само към класове, но и към методи. Така че, обобщен метод може да бъде деклариран в редовен клас.
Както може да се види от фигурата по-горе, в обявяването на обобщения метод няма нищо сложно. Достатъчно е преди изчисления тип метод да се поставят ъглови скоби и да се определят в тях параметрите на видовете. В случай на конструктор, всичко се извършва по същия начин:
Ъгловите скоби в този случай се отнасят до името на конструктора, тъй като не връща никакво значение. Резултатът от двете програми ще бъде: Integer String

Свързани публикации