Ти тут

Java generics: опис і методи

Починаючи з самого появи мову Java зазнав масу змін, які, без сумніву, привнесли позитивні моменти в його функціональність. Одним з таких значущих змін є введення Java Generic або узагальнення. Дана функціональність зробила мову не тільки гнучкіше і універсальніше, але і набагато безпечніше в плані приведення типів даних.

java generics опис

Справа в тому, що до введення дженериків узагальнений код в Java можна було створювати, тільки оперуючи посиланнями типу Object. Такі посилання можна привласнювати будь-якого об`єкта. Адже всі класи в Java є неявними спадкоємцями класу Object. Однак такий підхід є потенційним джерелом багатьох помилок, пов`язаних з безпекою типів при явному перетворенні об`єкта з Object до цільового типу. При використанні узагальнень все приведення виконуються неявно і автоматично, що виключає навіть потенційну можливість виникнення помилок.

Java Generics: опис і приклад

Розберемо простий приклад застосування узагальнення до звичайного класу на малюнку нижче. І вже потім приступимо до детального розгляду всіх тонкощів і нюансів Java Generic.

generic class java

Зверніть увагу на те, яким чином відбувається оголошення класу Pair. Відразу після імені класу відкриваються кутові дужки, в яких вказується буква T. Вона являє собою своєрідний заповнювач, який в процесі створення екземпляра даного класу буде замінений конкретним типом. Виглядає це наступним чином: Pair obj = new Pairlt; Integer gt; (). Слід зазначити, що замість T можна вказувати будь-яку букву, але, як правило, використовують T, V або E.

Примітка: починаючи з восьмої версії Java, вказавши цільової тип при оголошенні посилання, кутові дужки в конструкторі можна залишити порожніми. Так Наведений вище приклад можна переписати таким чином: Pair obj = new Pairlt; gt; ().

Коли клас оголошений таким чином, далі в його тілі замість конкретних типів полів, посилань і повертаються методами об`єктів можна використовувати цю букву. Оскільки T при створенні об`єкта класу замінюється конкретним типом, поля first і second в даному випадку будуть мати тип Integer.

За логікою, аргументи firstItem і secondItem, що передаються відповідному конструктору, також повинні мати тип Integer або його підкласу. Якщо ви спробуєте передати тип даних, що відрізняється від того, що був зазначений при створенні об`єкта, компілятор не пропустить цю помилку. Так, конструктор з аргументами при створенні об`єкта матиме такий вигляд: Pair obj = new Pairlt; gt; (new Integer (1), new Integer (2)). Те ж саме відноситься до аргументів методів setFirst і setSecond. І як ви вже, напевно, здогадалися, методи getFirst і getSecond повертатимуть значення типу Integer.

Узагальнений клас з декількома параметрами типів



В узагальнених класах також можна оголошувати кілька параметрів типу, які задаються в кутових дужках через кому. Перероблений під такий випадок клас Pair представлений на малюнку нижче.

java generic

Як бачимо, при створенні екземпляра такого класу в кутових дужках слід вказувати ту саму кількість типів, що і параметрів. Якщо ви знайомі з таким видом структури даних, як Map, то ви могли помітити, що там використовується точно такий же принцип. Там перший аргумент визначає тип ключа, а другий - тип значення. Слід зазначити, що типи переданих при створенні об`єкта аргументів можуть збігатися. Так, таке оголошення примірника класу Pair є абсолютно коректним: Pair obj.

Деякі особливості узагальнень

Перед тим як йти далі, слід зазначити, що компілятор Java не створює ніяких різних версій класу Pair. Насправді в процесі компіляції вся інформація про узагальнений тип видаляється. Замість цього виконується приведення відповідних типів, створюючи спеціальну версію класу Pair. Однак в самій програмі, як і раніше існує єдина узагальнена версія даного класу. Цей процес називається в Java Generic очищення типу.

Відзначимо важливий момент. Посилання на різні версії одного і того ж java generic класу не можуть вказувати на один і той же об`єкт. Тобто, припустимо, у нас є два посилання: Pair obj1 і Pair obj2. Отже, в рядку obj1 = obj2 виникне помилка. Хоча обидві змінні відносяться до типу Pair, об`єкти, на які вони посилаються, різні. Це яскравий приклад забезпечення безпеки типів в Java Generic.

Дізнатися про обмеження узагальнені класи



Важливо знати, що узагальнення можуть застосовуватися тільки до посилальним типам, тобто передається параметру generic class java аргумент обов`язково повинен бути типом класу. Такі прості типи, як, наприклад, double або long, передавати не можна. Іншими словами, наступний рядок оголошення класу Pair неприпустима: Pair obj. Проте це обмеження не становить серйозної проблеми, так як в Java для кожного примітивного типу є відповідний клас-оболонка. Строго кажучи, якщо в класі Pair ви хочете инкапсулировать целочисленное і логічне значення, автоупаковка зробить все за вас: Pair obj = new Pairlt; gt; (25, true).

Ще одним серйозним обмеженням є неможливість створення екземпляра параметра типу. Так, наступний рядок викличе помилку компіляції: T first = new T (). Це очевидно, оскільки ви заздалегідь не знаєте, чи буде в якості аргументу передаватися повноцінний клас або абстрактний, або зовсім інтерфейс. Те ж саме стосується створення масивів.

обмежені типи

Досить часто виникають ситуації, коли необхідно обмежити перелік типів, які можна передавати в якості аргументу java generic класу. Припустимо, що в нашому класі Pair ми хочемо инкапсулировать виключно числові значення для подальших математичних операцій над ними. Для цього нам необхідно задати верхню межу параметра типу. Реалізується це за допомогою оголошення суперкласу, успадкованого усіма аргументами, що передаються в кутових дужках. Виглядати це буде наступним чином: class Pair. Таким способом компілятор дізнається, що замість параметра T можна підставляти або клас Number або один з його підкласів.

Це поширений прийом. Такі обмеження часто використовуються для забезпечення сумісності параметрів типу в одному і тому ж класі. Розглянемо приклад на нашому класі Pair: class Pair. Тут ми повідомляємо компілятору, що тип Т може бути довільним, а тип V обов`язково повинен бути або типом Т, або одним з його підкласів.

Обмеження «знизу» відбувається точно таким же чином, але замість слова extends пишеться слово super. Тобто оголошення class Pair говорить про те, що замість Т може бути підставлений або ArrayList, або будь-який клас або інтерфейс, які він успадковує.

Generic методи Java і конструктори

У Java узагальнення можна застосовувати не тільки в відношенні класів, а й методів. Так, узагальнений метод може бути оголошений в звичайному класі.

Відео: Java для початківців

generic методи java

Як видно на малюнку вище, в оголошенні узагальненого методу немає нічого складного. Досить перед повертається методом типом поставити кутові дужки і вказати в них параметри типів.

У разі конструктора все робиться аналогічно:

java generic очищення типу

Кутові дужки в цьому випадку ставляться перед назвою конструктора, так як він не повертає ніякого значення. Результатом роботи обох програм буде:

Integer

Відео: Сирі типи - Generics # 1 - Advanced Java

String

Поділися в соц мережах:

Увага, тільки СЬОГОДНІ!

Схожі повідомлення


Увага, тільки СЬОГОДНІ!