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);, gdziemyArrayto 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 typuTi 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,Booleanoraz 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, gdzieTrozszerzaComparable<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ęPersonz polaminameiagei przetestuj metodęminValuena tablicy obiektówPerson.Napisz statyczną metodę generyczną
maxValue, która przyjmuje tablicę elementów typu generycznegoT, gdzieTrozszerzaComparable<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ęVehiclez polamimodelispeed, implementującą generycznyComparable, i przetestuj metodęmaxValuena tablicy obiektówVehicle.Utwórz statyczną metodę generyczną
sortAndReturnFirst, która przyjmuje tablicę elementów typu generycznegoT, gdzieTrozszerzaComparable<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 klasieBookz polamititleiauthor. KlasaBookpowinna implementować generyczny interfejsComparablena podstawie polatitlezgodnie z porządkiem naturalnym.Napisz statyczną metodę generyczną
printArray, która przyjmuje jako argument tablicę elementów typu generycznegoTi drukuje wszystkie elementy tablicy. Przetestuj tę metodę na tablicy typuIntegeriDouble. Następnie spróbuj przetestować metodę na tablicy typu prostego, np.intlubdouble, 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 generycznegoTi zwraca ich sumę. Przetestuj tę metodę na kolekcji typuIntegerorazFloat. Następnie spróbuj użyć tej metody z kolekcją typów prostych, np.intlubfloat, 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 generycznegoTi zwraca wartośćbooleanwskazującą, czy są one równe. Przetestuj metodę na parze obiektówInteger,StringorazCharacter. Następnie spróbuj przetestować tę samą metodę na typach prostych, takich jakintczychar, 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 generycznegoTz 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), gdzieDogdziedziczy poAnimal. Następnie napisz statyczną metodę generycznąfindMax, która przyjmuje dwa argumenty:element1ielement2typuextends 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), gdzieElectricCardziedziczy poCar. Napisz statyczną metodę generycznącompareObjects, która przyjmuje dwa argumenty:object1iobject2typuextends 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), gdzieDogdziedziczy 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:BirdiEagle, gdzieEagledziedziczy 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:BirdiEagle, gdzieEagledziedziczy 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:ShapeiCircle, gdzieCircledziedziczy 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:PersoniStudent, gdzieStudentdziedziczy 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), gdzieDogdziedziczy poAnimal. KlasaDogma posiadać prywatne poleage, które nie posiada klasaAnimal. Następnie napisz statyczną metodę generycznąfindMinMaxAge, która przyjmuje jako argument tablicę obiektów typuDogorazPair<?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ówComparableczyComparator.Stwórz klasę generyczną
Pair<T>, która przechowuje dwa obiekty tego samego typu. Następnie utwórz dwie klasy:PlantiTree, gdzieTreedziedziczy poPlant. KlasaTreepowinna posiadać prywatne poleheight, którego nie posiada klasaPlant. Następnie napisz statyczną metodę generycznąfindMinMaxHeight, która przyjmuje jako argument tablicę obiektów typuTreeorazPair<? 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.