2009-11-03 22 views
10

mogę się mylić, kiedy natknąć ogólnej metody tego rodzaju.Jaki jest pożytek z <T><T> w public static T addAndReturn (elementu T Collection <T> kolekcja) {

public static <T> T addAndReturn(T element, Collection<T> collection){ 
    collection.add(element); 
    return element; 
} 

Nie mogę zrozumieć, dlaczego w tej metodzie wymagane jest <T>.

Jaka jest różnica między metodami generycznymi a metodami wykorzystującymi składnię generyczną?

+0

Przeczytaj wskazówki dotyczące formatowania przed przesłaniem pytania. Trudno je przegapić. – Joe

+1

spróbuj sformatować przykłady kodu jako kod – NDM

+0

@Joe, @Nicky De Maeyer: Rozwiązałem problemy z formatowaniem i usunąłem PS. – Asaph

Odpowiedz

4

Alternatywa, używając obiektu zamiast T, spowoduje, że funkcja zwróci obiekt.

Kiedy zwraca T, można zrobić coś takiego:

addAndReturn(myElement, col).SomeMethodOfMyElement(); 

Jeśli addAndReturn zwrócony obiekt zamiast, trzeba by użyć jednej

((MyElementType)addAndReturn(myElement, col)).SomeMethodOfMyElement(); 

który wymaga wyraźnej obsady lub

addAndReturn(myElement, col); 
myElement.SomeMethodOfMyElement; 

która potrzebuje dwóch instrukcji zamiast jednej.


EDIT: Teraz, gdy sprawa została sformatowana, widzę, że jeden z parametrów jest Collection<T>. W takim przypadku ogólna składnia zapewnia, że ​​zamiast błędu wykonania zwraca błąd podczas kompilacji.


EDIT: I tylko w przypadku, gdy pytanie o składni <T> zamiast o stosowaniu leków generycznych ogólnie: <T> informuje kompilator, że T użyte w definicji metody jest nie niektóre klasy T ale raczej symbol zastępczy dla jakiejkolwiek klasy "pasuje" do konkretnego wywołania metody.

+1

Dzięki za ostatni komentarz EDYT. O to właśnie chodzi w moim pytaniu. Wszystko, co muszę wiedzieć, to jest to. Czy poniższe fragmenty kodu mają wpływ na kompilator? Jeśli tak to jak? 1. public static T addAndReturn (Collection kolekcja) {} 2. public static T addAndReturn (Collection kolekcja) {} –

+0

Niestety. Tęskniłem też za formatowaniem. Czy możesz dać mi znać, jak mogę sformatować mój kod w tym? –

+0

W drugim wariancie kompilator myśli, że tworzysz funkcję, która zwraca klasę T. Literalny "T", jak w "klasie T {...}". W pierwszym wariancie tworzysz funkcję, która działa dla * wszystkich * klas: Jeśli prześlesz liczbę całkowitą i kolekcję , zwróci ona liczbę całkowitą. – Heinzi

-1

To jest ogólny T jest po prostu symbolem zastępczym dla bardziej konkretnego typu, który jest zwracany. W przypadku, gdy podałeś T, jest to typ elementu, który dodajesz do kolekcji.

Collection<int> intCollection = new Collection(); 
int addedInt = addAndReturn(5, intCollection); 
addedInt == 5; 

Ponieważ są one wszystkie T zamiast T1 lub T2 muszą być tego samego typu obiektu jako wymagany jest jeden rodzaj oczywiście ponieważ funkcja dodaje typ do kolekcji generycznych

+2

Ponieważ to jest java, miałem nadzieję, że masz na myśli kolekcję :) – penpen

-1

T służy do polimorficzne powody, jeśli możemy tak powiedzieć. T jest dowolnym typem klasy Type.

Mimo to, jeśli masz na przykład klasę klienta, możesz użyć tej metody, aby przetworzyć typ użytkownika Klasy klienta. T pozwala umieścić w dowolnym rodzaju, który chcesz.

T pozwoli ci użyć tej ogólnej metody dla własnych typów zdefiniowanych przez użytkownika, tak jak to zrobi dla typów wartości lub dowolnych innych typów. T staje się typem określonym w parametrze elementu.

0

Ta metoda zwraca to samo wejście element prawdopodobnie dlatego realizatorzy przeznaczone do korzystania z Fluent Interface podobny sposób w celu zapewnienia bardziej czytelny API:

addAndReturn(myElement, col).doElementStuff().doOtherElementStuff(); 

Here masz ładny tutorial rodzajowych Java, które uważam za kompletne i pouczające .

8
> public static <T> T addAndReturn(T 
> element, Collection<T> collection){ 
>  collection.add(element); 
>  return element; } 

<T> (w nawiasach kątowych) jest znany jako parametr typu rodzajowego, natomiast T bezpośrednio poprzedzający nazwę metody jest typ wrócimy. Możesz mieć rodzajową metodę, która zwraca inny typ niż typ ogólny. Być może chcesz metodę, która dodaje element do kolekcji (więc obiekt typu T) i zamiast zwracać dodany obiekt (który również byłby typu T), chcesz, aby zwrócił indeks tego elementu w kolekcja, która zawsze będzie int.

przykładowy sposób podpis w którym typ powrotu nie jest typ ogólny: Metody

public static <T> Integer addAndReturn(T element, Collection<T> collection) 

rodzajowe, jak każdy inny sposób, może mieć dowolny typ powrotnego, w tym samym rodzaju rodzajowego, innego typu klasy każde podstawowy lub nieodłączny typ danych lub nieważny. Możesz pomylić 2 niepowiązane części sygnatury metody, myśląc, że są zależne, a kiedy nie. Są one "zależne" w tym sensie, że jeśli używasz T jako typu zwracającego, typ wartości zwracanej jest typu ogólnego, który podajesz w witrynie wywołania.