25 Programowanie generyczne
Stwórz prostą klasę generyczną
Box
, która może przechowywać obiekt dowolnego typu. Klasa powinna zawierać metodęset
, aby ustawić obiekt, oraz metodęget
, aby go pobrać.Napisz generyczną metodę
isEqual
, która przyjmuje dwa dowolne obiekty tego samego typu i zwracatrue
, jeśli są one równe, w przeciwnym raziefalse
.Stwórz klasę generyczną
Counter<T>
, która będzie zliczać ilość dodanych elementów określonego typu. Klasa powinna mieć metodęadd(T element)
, która dodaje element do wewnętrznej struktury, oraz metodęgetCount()
, która zwraca liczbę dodanych elementów.Stwórz klasę generyczną
Triple<T, U, V>
, która może przechowywać trzy obiekty różnych typów. Zaimplementuj metodygetFirst()
,getSecond()
igetThird()
do pobierania odpowiednio pierwszego, drugiego i trzeciego elementu.Napisz generyczną metodę
max
, która przyjmuje tablicę elementów typu porównywalnego (implementujących interfejsComparable<T>
) i zwraca element o najwyższej wartości. Uwzględnij obsługę przypadku pustej tablicy.Zdefiniuj generyczny interfejs
Stack<T>
z metodamipush(T item)
,T pop()
,T peek()
iboolean isEmpty()
. Stwórz klasę implementującą ten interfejs, która będzie reprezentować stos przechowujący elementy dowolnego typu.Stwórz klasę generyczną
Storage<T>
, która przechowuje pojedynczy obiekt dowolnego typu. Klasa powinna mieć metodystore(T item)
, która zapisuje obiekt, orazT retrieve()
, która zwraca przechowywany obiekt.Napisz generyczną metodę
printArray
, która przyjmuje tablicę elementów dowolnego typu i wypisuje wszystkie elementy tej tablicy na standardowe wyjście. Metoda powinna być w stanie obsłużyć tablice każdego typu obiektów.Stwórz klasę generyczną
Pair
, która przechowuje dwie wartości dowolnego typu. Klasa powinna mieć dwie metody:getFirst()
, która zwraca pierwszy element pary, igetSecond()
, która zwraca drugi element pary.Napisz generyczną metodę
swap
, która przyjmuje tablicę dowolnego typu oraz dwie liczby całkowite reprezentujące indeksy. Metoda powinna zamienić miejscami elementy tablicy na podanych indeksach.Stwórz generyczną klasę
GenericQueue<T>
, która implementuje prostą kolejkę. Klasa powinna mieć metodyenqueue(T element)
, która dodaje element do kolejki, idequeue()
, która usuwa i zwraca element z początku kolejki.Napisz statyczną metodę generyczną
swap
, która przyjmuje tablicę dowolnego typu i dwa indeksy, a następnie zamienia miejscami elementy w tej tablicy pod wskazanymi indeksami. Metoda powinna działać dla tablicy każdego typu. Przykładowe wywołanie metody:swap(myArray, 0, 2);
, gdziemyArray
to tablica typuInteger[]
lub dowolnego innego typu. Zabezpiecz metodę tak, aby nie można było jej wywołać z indeksami spoza zakresu tablicy.Utwórz statyczną metodę generyczną
reverseArray
, która przyjmuje tablicę elementów typuT
i odwraca kolejność jej elementów. Metoda powinna modyfikować przekazaną tablicę, nie zwracając nowej. Sprawdź działanie metody na tablicach różnych typów, takich jakCharacter
,Boolean
oraz własnych typów obiektowych. Zabezpiecz metodę tak, aby nie można było jej wywołać z tablicąnull
.Napisz statyczną metodę generyczną
minValue
, która przyjmuje tablicę elementów typu generycznegoT
, gdzieT
rozszerzaComparable<T>
. Metoda powinna zwracać najmniejszy element z tablicy. Przetestuj tę metodę na tablicach zawierających różne typy porównywalnych obiektów, takie jakInteger
,Double
, czyString
. Zabezpiecz metodę tak, aby nie można było jej wywołać z tablicą o zerowej liczbie elementów. Dodaj klasęPerson
z polaminame
iage
i przetestuj metodęminValue
na tablicy obiektówPerson
.Napisz statyczną metodę generyczną
maxValue
, która przyjmuje tablicę elementów typu generycznegoT
, gdzieT
rozszerzaComparable<T>
. Metoda powinna zwracać największy element z tablicy. Upewnij się, że metoda nie akceptuje pustej tablicy (o zerowej liczbie elementów). Przetestuj metodę na tablicach zawierających różne typy porównywalnych obiektów, jakInteger
,Float
, czyString
. Stwórz klasęVehicle
z polamimodel
ispeed
, implementującą generycznyComparable
, i przetestuj metodęmaxValue
na tablicy obiektówVehicle
.Utwórz statyczną metodę generyczną
sortAndReturnFirst
, która przyjmuje tablicę elementów typu generycznegoT
, gdzieT
rozszerzaComparable<T>
. Metoda powinna sortować tablicę i zwracać jej pierwszy element. Zabezpiecz metodę przed wywołaniem z pustą tablicą (o zerowej liczbie elementów). Przetestuj tę metodę na różnych typach danych, w tym na nowo utworzonej klasieBook
z polamititle
iauthor
. KlasaBook
powinna implementować generyczny interfejsComparable
na podstawie polatitle
zgodnie z porządkiem naturalnym.Napisz statyczną metodę generyczną
printArray
, która przyjmuje jako argument tablicę elementów typu generycznegoT
i drukuje wszystkie elementy tablicy. Przetestuj tę metodę na tablicy typuInteger
iDouble
. Następnie spróbuj przetestować metodę na tablicy typu prostego, np.int
lubdouble
, i zanotuj wynikające z tego błędy kompilacji. Wyjaśnij, dlaczego Java nie pozwala na użycie typów prostych w kontekście typów generycznych.Utwórz statyczną metodę generyczną
sumElements
, która przyjmuje kolekcję elementów typu generycznegoT
i zwraca ich sumę. Przetestuj tę metodę na kolekcji typuInteger
orazFloat
. Następnie spróbuj użyć tej metody z kolekcją typów prostych, np.int
lubfloat
, i zobacz, jakie błędy kompilacji się pojawią. Wykorzystaj to do wyjaśnienia różnicy między typami prostymi a obiektowymi w Javie.Zaprojektuj statyczną metodę generyczną
compareElements
, która przyjmuje dwa argumenty typu generycznegoT
i zwraca wartośćboolean
wskazującą, czy są one równe. Przetestuj metodę na parze obiektówInteger
,String
orazCharacter
. Następnie spróbuj przetestować tę samą metodę na typach prostych, takich jakint
czychar
, i opisz napotkane problemy związane z próbą użycia typów prostych w generykach.Napisz statyczną metodę generyczną
printObjectInfo
, która przyjmuje argument typu generycznegoT
z górnym ograniczeniem typuObject
. Metoda powinna drukować klasę obiektu, jego hashcode oraz wynik metodytoString()
. Przetestuj tę metodę na różnych typach obiektów, jakString
,Integer
, własnych klasach np.Car
,Animal
, gdzie każda klasa ma własne unikalne pola i metody.Utwórz dwie klasy:
Animal
(Zwierzę) iDog
(Pies), gdzieDog
dziedziczy poAnimal
. Następnie napisz statyczną metodę generycznąfindMax
, która przyjmuje dwa argumenty:element1
ielement2
typuextends Animal
. Metoda powinna zwracać element większy według własnie zdefiniowanego kryterium porównania. W implementacji porównaj elementy bazując na wybranym przez siebie atrybucie, na przykład wieku.Zdefiniuj klasy
Car
(Samochód) iElectricCar
(Samochód Elektryczny), gdzieElectricCar
dziedziczy poCar
. Napisz statyczną metodę generycznącompareObjects
, która przyjmuje dwa argumenty:object1
iobject2
typuextends Car
. Metoda ma zwracać wartośćtrue
, jeśli obiekty są tego samego typu, w przeciwnym wypadkufalse
. Użyj metodygetClass()
do porównania klas obiektów.Stwórz klasę generyczną
Pair<T>
która przechowuje dwa obiekty tego samego typu. Utwórz dwie klasy:Animal
(Zwierzę) iDog
(Pies), gdzieDog
dziedziczy poAnimal
. Następnie napisz statyczną metodę generycznąfindMax
, która przyjmujePair<? extends Animal>
. Metoda powinna zwracać element większy według własnie zdefiniowanego kryterium porównania.Stwórz klasę generyczną
Triple<T>
, która przechowuje trzy obiekty tego samego typu. Następnie utwórz dwie klasy:Bird
iEagle
, gdzieEagle
dziedziczy poBird
. Potem napisz statyczną metodę generycznąfindMin
, która przyjmujeTriple<? extends Bird>
. Ta metoda powinna zwracać element mniejszy na podstawie kryterium porównania zdefiniowanego przez ciebie.Stwórz klasę generyczną
Triple<T>
, która przechowuje trzy obiekty tego samego typu. Następnie utwórz dwie klasy:Bird
iEagle
, gdzieEagle
dziedziczy poBird
. Potem napisz statyczną metodę generycznąfindMin
, która przyjmujeTriple<? extends Bird>
. Ta metoda powinna zwracać element mniejszy na podstawie kryterium porównania zdefiniowanego przez ciebie.Stwórz klasę generyczną
ElementPair<T>
, która przechowuje dwa obiekty tego samego typu. Utwórz dwie klasy:Shape
iCircle
, gdzieCircle
dziedziczy poShape
. Następnie napisz statyczną metodę generycznąfindLargest
, która przyjmujeElementPair<? extends Shape>
. Metoda powinna zwracać element większy według własnie zdefiniowanego kryterium porównania.Stwórz klasę generyczną
DoubleElement<T>
, która przechowuje dwa obiekty tego samego typu. Utwórz dwie klasy:Person
iStudent
, gdzieStudent
dziedziczy poPerson
. Następnie napisz statyczną metodę generycznąfindYoungest
, która przyjmujeDoubleElement<? extends Person>
. Metoda powinna zwracać element mniejszy według własnego kryterium porównania, na przykład wieku.Stwórz klasę generyczną
Pair<T>
która przechowuje dwa obiekty tego samego typu. Utwórz dwie klasy:Animal
(Zwierzę) iDog
(Pies), gdzieDog
dziedziczy poAnimal
. KlasaDog
ma posiadać prywatne poleage
, które nie posiada klasaAnimal
. Następnie napisz statyczną metodę generycznąfindMinMaxAge
, która przyjmuje jako argument tablicę obiektów typuDog
orazPair<?super Dog> result
. Metoda powinna ma zapisać (jako obiekty typuDog
) najmniejszy i najmniejszy (pod kątem wieku) psa z tablicy w drugim argumencie metody. Zrób to bezpośrednio bez używania interfejsówComparable
czyComparator
.Stwórz klasę generyczną
Pair<T>
, która przechowuje dwa obiekty tego samego typu. Następnie utwórz dwie klasy:Plant
iTree
, gdzieTree
dziedziczy poPlant
. KlasaTree
powinna posiadać prywatne poleheight
, którego nie posiada klasaPlant
. Następnie napisz statyczną metodę generycznąfindMinMaxHeight
, która przyjmuje jako argument tablicę obiektów typuTree
orazPair<? super Tree> result
. Metoda powinna zapisać (jako obiekty typu Tree) najniższe i najwyższe (pod kątem wysokości) drzewo z tablicy w drugim argumencie metody. Wykorzystaj też generyczny interfejsComparable
.