Generyki, a ograniczenie górne

0

Hej, próbuję rozgryźć ideę generyków w Javie. O ile w przypadku prostych przykładów na pierwszy rzut oka widać zalety, to zastanawiam się w czym generyki są lepsze, jeśli chodzi o górne ograniczenia. Weźmy prosty przykład liczenia średniej.

Wersja z generykiem

class Generic<T extends Number> {
    private T[] numbers;

    Generic(T[] numbers) {
        this.numbers = numbers;
    }

    double avg() {
        double sum = 0;
        for (T number : numbers) {
            sum += number.doubleValue();
        }
        return sum / numbers.length;
    }
}

Musimy się zawęzić do podklasy Number stąd zrobiłem <T extends Number>. Wszystko oczywiście działa i dla inta i dla floata, ale można by też zrobić tak:

class Normal {
    private Number[] numbers;

    Normal(Number[] numbers) {
        this.numbers = numbers;
    }

    double avg() {
        double sum = 0;
        for (Number number : numbers) {
            sum += number.doubleValue();
        }
        return sum / numbers.length;
    }
}

Ten przykład działa oczywiście tak samo. I teraz rozkminiam dla tego konkretnego przykładu, czy warto robić klasę parametryzowaną, czy może normalną. ;)

2

Dla tego konkretnego przykładu nie ma znaczenia - więc nie warto ( niepotrzebna komplikacja).

Rożnicę zobaczysz dopiero jak będziesz miał metody typu:

T max () { .. }
vs
Number max() { ... }

Ta druga wersja gubi informację o tym co wrzucaliśmy - przez co nawet jak wiemy, że jest tam Float (bo wrzuciliśmy tablice Float[]) to musimy po wyjęciu np. rzutować, żeby móc przykładowo wykonać operację .max().isInfinite();

1

Dla tego konkretnego przykładu nie ma sensu używać "generyków".

Jest sens, jeżeli tworzysz klasę która zwraca w swoich metodach typ generyczny.
np.

HotelDao<T extends DbObject> {
  T getById() {}
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1