Metody generyczne w Javie

0

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

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

1

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

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.

1

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

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

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

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>().

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

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.

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