Параметризирани Java класове

Най-важните нововъведения във версията на езика J2SE 5 включват появата на параметризирани (родови) класове и методи, позволяващи използването на по-гъвкави и в същото време доста силни текстове, което е особено важно при работа с колекции. Използването на общи класове за създаване на типизирани колекции ще бъде обсъдено в главата Колекции. Параметризацията ви позволява да създавате класове, интерфейси и методи, в които видът на обработваните данни е посочен като параметър.

Ето пример за общ клас с два параметъра:

публично клас Предмет

частни Име Т1;

публично Тема (T2 идентификатори, имена T1)

Обект на класа Предмет може да се създаде по следния начин:

нов предмет (ch, 71D);

Параметризираните типове осигуряват безопасност на типа.

Следва пример за параметризиран клас По желание с конструктори и методи, както и инициализация и изследване на поведението на обектите при задаване на различни параметри.

/ * пример # 10: създаване и използване на параметризирани обекти

публично клас По желание

частни T стойност;

публично По избор (T стойност)

публично T getValue ()

публично нищожен setValue (T val)

публично String toString ()

връщане value.getClass (). getName () + " + стойност;

публично статични нищожен main (String [] аргументи)

инт v1 = ob1.getValue ();

ново По избор ("Java");

Низ v2 = ob2.getValue ();

// ob1 = ob2; // грешка при компилация - параметризацията не е ковариантна

По избор ob3 = ново По избор ();

ob3.setValue ("Java SE 6");

тип обект, а не тип параметризация * /

В резултат на изпълнението на тази програма ще се покаже следното:

java.lang.String Java SE 6

В разглеждания пример обекти от типа По желание: ob1 въз основа на типа Цяло число и ob2 въз основа на типа Струна използвайки различни конструктори. По време на компилацията цялата информация за родови типове се изтрива и заменя за членовете и методите на класа с посочените типове или тип Обект, ако параметърът не е посочен, както за обекта ob3. Това изпълнение е необходимо, за да се осигури съвместимост с код, създаден в предишни версии на езика.

Декларацията за родов тип във формуляра, въпреки възможността да се използва какъвто и да е тип като параметър, ограничава обхвата на разработения клас. Променливите от този тип могат да извикват само методи на клас Обект. Достъпът до други методи е ограничен от компилатора, предотвратявайки възможни варианти на грешки.

обществена класа Незадължително

Такъв запис показва това като тип т разрешени са само класове, които са наследници (суперкласове) на класа Тип, и съответно става възможно да се извикат методи на ограничаващи типове.

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

/ * пример # 11: използване на метасимвол в параметризиран клас: Марк.ява, Runner.java * /

публично Марка (стойност T)

публично T getMark ()

/ * вместо */// публичен булев sameAny (Марк ob)

публично булев sameAny (Mark ob)

връщане roundMark () == ob.roundMark ();

публично булев същото (маркиране на)

връщане getMark () == ob.getMark ();

публично статични нищожен main (String [] аргументи)

Маркирайте md = ново Марка (71.4D);//71.5d

Маркирайте mi = ново Марк (71);

Резултатът ще бъде изведен:

Метод sameAny (Марк ob) може да приема обекти от тип Марк, инициализиран с който и да е от типовете, разрешени за този клас, докато метод с параметър Марк може да приема обекти с инициализация от същия тип като извикващия обект.

Има редица ограничения за родови типове. Например, това е невъзможно­но направете изрично извикване на конструктора от общ тип:

тъй като компилаторът не знае кой конструктор може да бъде извикан и колко памет трябва да бъде разпределена при създаване на обект.

По подобни причини общите полета не могат да бъдат статични, статичните методи не могат да имат общи параметри или да имат достъп до общи полета, например: