Узагальнення в Java (англ. generics) — це можливість узагальненого програмування, що була додана у мову програмування Java в 2004 році як частина стандартної платформи J2SE 5.0. Узагальнення дають можливість створювати типи або методи таким чином, щоб вони могли оперувати різноманітними типами даних, при цьому на етапі компіляції для типів забезпечується відповідний механізм безпеки. Так, наприклад, метод може приймати параметри типу String або Integer і повертати різноманітні типи без реалізації програмістом кількох різних методів. Після появи узагальнень, ряд класів платформи Java були перероблені під їх використання. Так узагальнення реалізовані в колекціях класів Java (Java Collections Framework), які можуть одночасно зберігати та оперувати різноманітними типами даних. До їх появи для досягнення згаданих цілей програміст використовував надкласи тих типів з якими необхідно працювати та коли це було необхідно здійснювалося перетворення типів, проте при такому підході легко допуститися цілого ряду помилок, які виявляються лише під час виконання програми.
Мотивація
Наступний блок Java коду демонструє проблему, що виникає, коли узагальнення не застосовуються. Спочатку створюється список: оголошується ArrayList
, методи якого працюють з даними типу Object, який є суперкласом для усіх класів Java. Тобто ArrayList може працювати з будь-яким типом даних. Далі додаємо рядок тексту типу String
до списку. І зрештою, пробуємо одержати доданий рядок привівши його до типу Integer
.
List v = new ArrayList(); v.add("test"); Integer i = (Integer)v.get(0); // Помилка під час виконання програми
Помилки під час компіляції ми не отримуємо. Проте ми отримуємо повідомлення про виняткову ситуацію під час виконання програми (java.lang.ClassCastException
) у третьому рядку. Даний тип проблеми можна усунути застосувавши узагальнення, наперед передбачивши, які типи можна поміщати в ArrayList.
З використанням узагальнень, вищенаведений код може бути переписаний таким чином:
List<String> v = new ArrayList<String>(); v.add("test"); Integer i = v.get(0); // (type error) Помилка під час компіляції
Параметр типу String
в кутових дужках оголошує, що ArrayList
призначений для String
. З узагальненнями, непотрібне перетворення типів в третьому рядку до будь-якого типу, результатом v.get(0)
буде String
, компілятор тепер знає, який тип повинен бути на виході і більш краще прослідкує за правильністю використання результату методу. Оскільки в програмі ми намагаємось отримати результат у змінну типу Integer, то ми отримаємо помилку під час компіляції програми. Звичайно, що це лише спрощений приклад із застосування узагальнень, але доволі показовий.
Відповідні класи, звичайно ж, повинні бути спроектовані відповідним чином. Ось невеликий витяг з опису інтерфейсів List
та Iterator
в пакеті java.util:
public interface List<E> { void add(E x); Iterator<E> iterator(); } public interface Iterator<E> { E next(); boolean hasNext(); }
Визначення узагальненого класу
Ось приклад узагальненого класу:
public class Entry<K, V> { private final K key; private final V value; public Entry(K k,V v) { key = k; value = v; } public K getKey() { return key; } public V getValue() { return value; } public String toString() { return "(" + key + ", " + value + ")"; } }
Зазначте, що даний приклад лише для ілюстрації. Кращу реалізацію класу можна знайти тут: stackoverflow.com discussion.
Даний узагальнений клас може бути використаний наступним чином:
Entry<String, String> grade440 = new Entry<String, String>("mike", "A"); Entry<String, Integer> marks440 = new Entry<String, Integer>("mike", 100); System.out.println("grade: " + grade440); System.out.println("marks: " + marks440);
Джерела
- Мова програмування Java(англ.)
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Uzagalnennya v Java angl generics ce mozhlivist uzagalnenogo programuvannya sho bula dodana u movu programuvannya Java v 2004 roci yak chastina standartnoyi platformi J2SE 5 0 Uzagalnennya dayut mozhlivist stvoryuvati tipi abo metodi takim chinom shob voni mogli operuvati riznomanitnimi tipami danih pri comu na etapi kompilyaciyi dlya tipiv zabezpechuyetsya vidpovidnij mehanizm bezpeki Tak napriklad metod mozhe prijmati parametri tipu String abo Integer i povertati riznomanitni tipi bez realizaciyi programistom kilkoh riznih metodiv Pislya poyavi uzagalnen ryad klasiv platformi Java buli pererobleni pid yih vikoristannya Tak uzagalnennya realizovani v kolekciyah klasiv Java Java Collections Framework yaki mozhut odnochasno zberigati ta operuvati riznomanitnimi tipami danih Do yih poyavi dlya dosyagnennya zgadanih cilej programist vikoristovuvav nadklasi tih tipiv z yakimi neobhidno pracyuvati ta koli ce bulo neobhidno zdijsnyuvalosya peretvorennya tipiv prote pri takomu pidhodi legko dopustitisya cilogo ryadu pomilok yaki viyavlyayutsya lishe pid chas vikonannya programi MotivaciyaNastupnij blok Java kodu demonstruye problemu sho vinikaye koli uzagalnennya ne zastosovuyutsya Spochatku stvoryuyetsya spisok ogoloshuyetsya ArrayList metodi yakogo pracyuyut z danimi tipu Object yakij ye superklasom dlya usih klasiv Java Tobto ArrayList mozhe pracyuvati z bud yakim tipom danih Dali dodayemo ryadok tekstu tipu String do spisku I zreshtoyu probuyemo oderzhati dodanij ryadok privivshi jogo do tipu Integer List v new ArrayList v add test Integer i Integer v get 0 Pomilka pid chas vikonannya programi Pomilki pid chas kompilyaciyi mi ne otrimuyemo Prote mi otrimuyemo povidomlennya pro vinyatkovu situaciyu pid chas vikonannya programi java lang ClassCastException u tretomu ryadku Danij tip problemi mozhna usunuti zastosuvavshi uzagalnennya napered peredbachivshi yaki tipi mozhna pomishati v ArrayList Z vikoristannyam uzagalnen vishenavedenij kod mozhe buti perepisanij takim chinom List lt String gt v new ArrayList lt String gt v add test Integer i v get 0 type error Pomilka pid chas kompilyaciyi Parametr tipu String v kutovih duzhkah ogoloshuye sho ArrayList priznachenij dlya String Z uzagalnennyami nepotribne peretvorennya tipiv v tretomu ryadku do bud yakogo tipu rezultatom v get 0 bude String kompilyator teper znaye yakij tip povinen buti na vihodi i bilsh krashe proslidkuye za pravilnistyu vikoristannya rezultatu metodu Oskilki v programi mi namagayemos otrimati rezultat u zminnu tipu Integer to mi otrimayemo pomilku pid chas kompilyaciyi programi Zvichajno sho ce lishe sproshenij priklad iz zastosuvannya uzagalnen ale dovoli pokazovij Vidpovidni klasi zvichajno zh povinni buti sproektovani vidpovidnim chinom Os nevelikij vityag z opisu interfejsiv List ta Iterator v paketi java util public interface List lt E gt void add E x Iterator lt E gt iterator public interface Iterator lt E gt E next boolean hasNext Viznachennya uzagalnenogo klasuOs priklad uzagalnenogo klasu public class Entry lt K V gt private final K key private final V value public Entry K k V v key k value v public K getKey return key public V getValue return value public String toString return key value Zaznachte sho danij priklad lishe dlya ilyustraciyi Krashu realizaciyu klasu mozhna znajti tut stackoverflow com discussion Danij uzagalnenij klas mozhe buti vikoristanij nastupnim chinom Entry lt String String gt grade440 new Entry lt String String gt mike A Entry lt String Integer gt marks440 new Entry lt String Integer gt mike 100 System out println grade grade440 System out println marks marks440 DzherelaMova programuvannya Java angl