Professional Documents
Culture Documents
NP1819 04.JAVA Generics PDF
NP1819 04.JAVA Generics PDF
Напредно
програмирање
Предавање 4
Генеричко програмирање
Вон. проф. д-р Ѓорѓи Маџаров
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 3
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 5
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Генерички класи
public class OldBox { public class Box<E> {
Object data; E data;
public OldBox(Object data) { public Box(E data) {
this.data = data; this.data = data;
} }
public Object getData() { public E getData() {
return data; return data;
} }
} }
НАПРЕДНО ПРОГРАМИРАЊЕ 7
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Генерици
Дефиницијата на класата со параметарски
типови се зачувува во датотека и компајлира
исто како и секоја друга класа
Еднаш компајлирана генеричка класа може
да се употребува како секоја друга класа
Како и да е, типот на класата на параметарскиот
тип мора да се специфицира пред да се користи
во програма
Ова се нарекува инстанцирање на генеричка
класа
Sample<String> object =
new Sample<String>();
НАПРЕДНО ПРОГРАМИРАЊЕ 8
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Дефиниција на класа со
параметарски тип
НАПРЕДНО ПРОГРАМИРАЊЕ 9
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Дефиниција на класа со
параметарски тип
Класата која е дефинирана со параметар
како тип се нарекува генеричка класа или
параметризирана класа
Параметарскиот тип се дава во аглести загради по
името на класата во нејзиното заглавие
Секоја не-клучен збор може да биде употребен
како идентификатор за параметарски тип
По конвенција параметарот стартува со голема
буква
Параметарскиот тип може да се употребува како и
секој друг тип во дефиницијата на класата
НАПРЕДНО ПРОГРАМИРАЊЕ 10
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 11
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 12
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 13
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 14
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 15
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 16
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 17
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 18
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Raw тип
Raw тип е името на генеричката класа или интерфејс
без било каков тип на аргументи.
public class Box<T> { public void set(T t)
{ /* ... */ } // ... }
За да се креира параметризиран тип од Box<T>
треба да се даде конкретен тип за формалниот
параметарски тип T:
Box<Integer> intBox = new Box<>();
Ако конкретниот тип се изостави, се креира raw тип
од Box<T>:
Box rawBox = new Box();
Box е raw тип на генеричкиот тип Box<T>. Не-
генеричка класа или интерфејс тип не е raw тип.
НАПРЕДНО ПРОГРАМИРАЊЕ 19
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Raw тип
Box<String> stringBox = new Box<>();
Box rawBox = stringBox; // OK
НАПРЕДНО ПРОГРАМИРАЊЕ 20
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 21
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 23
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 24
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 25
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 26
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 27
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 28
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 29
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 30
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 31
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 32
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 33
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 34
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Генерички интерфејси
Интерфејс може да има еден или
повеќе параметарски типови
Деталите и нотацијата е иста како и
класите со параметарски типови
НАПРЕДНО ПРОГРАМИРАЊЕ 35
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Генерички методи
Параметарскиот тип може да се користи кај
методите од генеричка класа
Како дополнување, генеричкиот метод може
да има свој параметарски тип, различен од
оној на класата
Генерички метод може да биде член на обична
или на генеричка класа и да има свој
параметарски тип
Параметарскиот тип на генеричкиот метод е
локален и важи за самиот метод, не и за класата
НАПРЕДНО ПРОГРАМИРАЊЕ 36
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Генерички методи
Параметарскиот тип мора за се зададе (во
аглести загради) по сите модификатори и
пред типот на повратниот податок
public static <T> T genMethod(T[] a)
Кога еден од овие генерички методи се
повикува, пред името на методот во аглести
загради се поставува конкретниот податочен
тип
String s = NonG.<String>genMethod(c);
НАПРЕДНО ПРОГРАМИРАЊЕ 37
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Генерички методи
Consider the following class: public class Bar<T> {
public class Foo { //Bar is parameterized
//Foo is not parameterized public T aMethod(T x) {
public <T> T aMethod(T x) { return x;
//will not compile without <T> }
//to indicate that this is a public static void
//parameterized method. main(String[] args) {
return x; Bar<Integer> bar =
} new Bar<Integer>();
public static void int k = bar.aMethod(5);
main(String[] args) { String s = bar.aMethod("abc");
Foo foo = new Foo(); //Compilation error here
int k = foo.aMethod(5); }
String s = foo.aMethod("abc"); }
}
}
Фиксна foo класа и променливи Објектот Bar<T> е фиксиран и ние
параметри на aMethod() сме врзани со конкретно T.
НАПРЕДНО ПРОГРАМИРАЊЕ 38
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 39
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 40
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 41
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 42
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 43
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 44
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 45
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 46
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 47
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 48
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Ограничувања на параметарските
типови
public class MathBox<E extends Number> extends Box<Number> {
public MathBox(E data) {
super(data);
}
public double sqrt() {
return Math.sqrt(getData().doubleValue());
}
}
<E extends Number> значи дека параметарскиот тип на MathBox мора да
биде под-класа на Number класата.
new MathBox<Integer>(5);//Legal
new MathBox<Double>(32.1);//Legal
new MathBox<String>(“No good!”);//Illegal
НАПРЕДНО ПРОГРАМИРАЊЕ 49
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Ограничувања на параметарските
типови
Во дефиницијата на параметризирана класа, параметарскиот тип е валиден
податочен тип:
НАПРЕДНО ПРОГРАМИРАЊЕ 50
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Генерици и subtyping
Иако следнава наредба се чини разумна сепак компајлерот дава
порака за грешка:
Box<Number> numBox = new Box<Integer>(31);
НАПРЕДНО ПРОГРАМИРАЊЕ 51
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Генерици и subtyping
Пораката за грешка која ја дава компајлерот е “Incompatible Type”
numBox може да содржи само објект од Number а не објект од тип
Integer (иако Integer е класа изведена од Number
НАПРЕДНО ПРОГРАМИРАЊЕ 52
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 53
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
Box<?>
НАПРЕДНО ПРОГРАМИРАЊЕ 55
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 57
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО
НАПРЕДНО ПРОГРАМИРАЊЕ 58
ФАКУЛТЕТ ЗА ИНФОРМАТИЧКИ НАУКИ
И КОМПЈУТЕРСКО ИНЖЕНЕРСТВО