Kategorie szkoleń | Egzaminy | Kontakt
  • 1
  • 0
  • 54

Typ generyczny o postaci <T extends A> może reprezentować:

  • typ T dziedziczący po klasie A lub
  • typ T implementujący interfejs A.

Czy można zdefiniować typ generyczny reprezentujący typ, który rozszerza klasę A i jednocześnie implementuje interfejs B?

  • Zapytał
  • @ | 29.11.2015
  • TRENER MODERATOR ALTKOM AKADEMII
Zaloguj się aby zadać pytanie
Pokrewne

Odpowiedź (1)

  • 0

Tak. Typy generyczne mogą mieć wiele ograniczeń (multiple bounds). Należy użyć składni:

<T extends A & B>

Tego typu konstrukcja nie zadziała dla typów anonimowych (zawierających dziką kartę ?).

Co więcej, może niezbyt często, ale można podać przykłady praktycznego wykorzystania tej konstrukcji.

Spróbujmy prześledzić jeden z takich przykładów. Zastanówmy się, jak zdefiniować metodę wyszukującą największą wartość w kolekcji?

W wersji niegenerycznej metoda mogłaby mieć następującą sygnaturę:

public static Object max(Collection c);

Jak należy ją przedefiniować, aby użyć typów generycznych?

Po pierwsze oznaczmy typ zwracany przez metodę literą T. Kolekcja może zawierać elementy typu lub dowolnego potomnego. Dlatego należy ją zadeklarować jako: Collection<? extends T>

Aby móc znaleźć element największy w kolekcji, jej elementy muszą być porównywalne, a więc implementować interfejs java.util.Comparable. Obiekty typu T można porównać tylko z obiektami tego samego typu lub nadtypu. Podsumowując sygnatura generycznej metody max powinna wyglądać następująco:

public static <T extends Comparable<? super T>> T max(Collection<? extends T> c);

Jednakże tak zdefiniowana metoda, po usunięciu informacji o typach generycznych (type erasure) będzie wyglądała następująco:

public static Comparable max(Collection c);

a więc niezgodnie z wyjściową sygnaturą (inne zwracane typy). Trzeba tak zdefiniować typ T, aby implementował interfejs Comparable, ale po usunięciu informacji o generykach, reprezentował typ Object. Można to osiągnąć następująco:

public static <T extends Object & Comparator<? super T>> T max(Collection<? extends T> c);

Taką metodę można znaleźć w klasie java.util.Collections

 

  • Odpowiedział
  • @ | 29.11.2015
  • TRENER MODERATOR ALTKOM AKADEMII