Metody generyczne w Javie

Metody generyczne w Javie
BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Ponieważ to mój pierwszy post na forum: Witam.
Zaczynam uczyć się JAVY i natrafiłem na taki zapis w API:

Kopiuj
public static <T> List<T> synchronizedList(List<T> list)

Rozumiem wszystko oprócz tego co oznacza w tym zapisie pierwsze <T>?Po co ono jest? Przecież typ zwracany i typ argumentu określone są przez List<T>.
Pozdrawiam

dodanie znaczników <code class="java"> + zmiana tematu wątku na sensowniejszy - fp

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
1

Ale czym jest T? Ten zapis mówi tyle że metoda jest zależna od pewnego parametru generycznego.

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Tylko po co umieszczać w sygnaturze metody to <T>, skoro to, że metoda jest zależna od parametru generycznego wiadomo z typu argumentu i typu wartości zwracanej? Umieszczenie <T> nic nie wnosi, stąd mój wniosek że ma to jakieś dodatkowe znacznie. Podana metoda pochodzi z klasy java.util.Collections.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Przypuśćmy, że jako kompilator napotkałbyś na deklarację:

Kopiuj
public static List<T> synchronizedList(List<T> list)

Skąd miałbyś wiedzieć, czym jest T i dlaczego nie jest czymś innym?

ShookTea
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 629
0

Po prostu gdy tworzyć obiekt klasy List, możesz zrobić po prostu List list = new List(), ale wtedy będziesz mógł dodawać do listy dosłownie wszystko, zaś użycie List<String> = new List() sprawia, że będziesz mógł dodawać tylko obiekty klasy String. Kompilując konstruktora public List<T>() kompilator zastępuje "T" klasą użytą do tworzenia obiektu, a wtedy (kontynuując przykład) zrozumie on jako public List<String>().

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Dzięki za oświecenie.
Niestety, jakoś wbiłem sobie, że jak widzę <T> to myślę o zmiennej generycznej, a tu
public static List<T> synchronizedList(List<T> list) metoda wywoływana z listą elementów jakiejś konkretnej klasy T
public static <T> List<T> synchronizedList(List<T> list) metoda wywoływana z listą generyczną.
Pozdrawiam

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

public List<T> synchronizedList(List<T> list)
To miałoby sens tylko w klasie generycznej, sparametryzowanej tym T.

Natomiast:
public <T> List<T> synchronizedList(List<T> list)
Tutaj T jest niezależny od deklaracji samego typu klasy.

PS:
Usunąłem static bo z tym słowem i bez <T> ten kod nie miałby sensu.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.