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

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

Забележка: като се започне с осмата версия на 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 обобщенията могат да се прилагат не само към класове, но и към методи. Така че, обобщен метод може да бъде деклариран в редовен клас.
Както може да се види от фигурата по-горе, в обявяването на обобщения метод няма нищо сложно. Достатъчно е преди изчисления тип метод да се поставят ъглови скоби и да се определят в тях параметрите на видовете. В случай на конструктор, всичко се извършва по същия начин:
Ъгловите скоби в този случай се отнасят до името на конструктора, тъй като не връща никакво значение. Резултатът от двете програми ще бъде: Integer String
Общ клас с няколко вида параметри

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

