Proste typy sparametryzowane (generics)

Zadanie 8 (7p)

Stworzyć klasę
Box reprezentujacą obiekty-zestawy elementów porównywalnych wraz operacjami na nich. Elementy zestawu są jednego, ale dowolnego typu. W danym zestawie, każdy element zajmuje określoną, unikalną  pozycję. Porządek między elementami (obiektami) danego typu (klasy) jest określany przez implementację sparametryzowanej wersji  interfejsu Comparable w klasie obiektów (zob. dokumentację klasy java.lang.Comparable).

Klasa
Box powinna posiadać między innymi następujące metody:
a.
add - dodaje element do zestawu, o ile nie było go w zestawie przed operacją,
b.
addAll - dodaje elementy podanej tablicy elementów do zestawu, o ile nie było ich w zestawie przed operacją,
c.
delete - usuwa element z zestawu, o ile wystapił on w zestawie przed operacją,
d.
swap - zamiana elementów w zestawie na dwóch podanych pozycjach,
e.
min (max) - znajdowanie (bez sortowania) minimum (maksimum) zestawu zgodnie ze zdefiniowanym porządkiem,
f.
search - sprawdzanie, czy podany element znajduje się w zestawie,
g.
print - wyświetla wszystkie elementy  zestawu.

W celu testowania, uczynić elementy typu
Osoba (z zadania 3) oraz Figura (z zadań 4-5) porównywalnymi według następujących kryteriów uporządkowania:
a. wśród elementów typu Osoba porównujemy najpierw nazwiska, w dalszej kolejności wiek,
b. wśród elementów typu
Figura porównujemy najpierw wartości pola, w dalszej kolejności wartości obwodu.

Test

Wykonać test wszystkich metod klasy
Box. Przykładowo, poniższy kod powinien się kompilować oraz dawać poprawne wyniki.

        Box<Osoba>  bo = new Box<Osoba>();
        bo.add(new Osoba("Kowalski", 19));                  // nazwisko, wiek
        bo.add(new Student("Kowalska", 18, 100));        // nazwisko, wiek, grupa
        bo.add(new Student("Kowalska", 20, 200));
        Osoba[] to = new Osoba[] {new Osoba("Nowak", 21), new Student("Nowak", 22, 200)};
        bo.addAll(to);
        bo.print();
        System.out.println(bo.min());   // Student 1: Kowalska, 18, 100
        
        Box<Figura> bf = new Box<Figura>();
        bf.add(new Kolo(10,10,40));
        bf.add(new Prostokat(10,10,40,40));
        Figura[] tf = new Figura[]{new Prostokat(0,0,50,50), new Kolo(0,0,50)};
        bf.addAll(tf);
        bf.print();
        System.out.println(bf.max());    // Kolo - srodek (0,0), promien 50
      
        Box<Integer> bi = new Box<Integer>();
        Integer[] ti = new Integer[] {new Integer(1), 2, 3};
        bi.addAll(ti);
        bi.print();    // 1, 2, 3
        
        Box<String> bs = new Box<String>();
        String[] ts = new String[] {"cpp", new String("java")};
        bs.addAll(ts);
        bs.swap(0,1);
        bs.print();    // java, cpp