Różnica polega na tym, że w pierwszym przypadku określamy, że obiekt wywołujący musi przekazać instancję Object (dowolna klasa), a otrzyma z powrotem inny obiekt (dowolną klasę, niekoniecznie tego samego typu).
W drugim zwracany typ będzie tego samego typu, jaki podano przy definiowaniu klasy.
Example ex = new Example<Integer>();
Tutaj określamy, jaki będzie typ T, co pozwala nam wymusić więcej ograniczeń na klasie lub metodzie. Na przykład możemy utworzyć instancję LinkedList<Integer>
lub LinkedList<Example>
i wiemy, że gdy wywołasz jedną z tych metod, otrzymamy z powrotem instancję typu Integer lub Example.
Głównym celem jest tutaj to, że kod wywołujący może określić typ obiektów, na których będzie działać klasa, zamiast polegać na rzutowaniu typów w celu wymuszenia tego.
Zobacz Java Generics * firmy Oracle.
* Zaktualizowany link.
Nie musisz robić dodatkowych rzutów klasowych. W pierwszym przypadku zawsze otrzymasz obiekt klasy java.lang.Object, który będziesz musiał przesłać do swojej klasy. W drugim przypadku T zostanie zastąpione klasą zdefiniowaną w sygnaturze ogólnej i nie będzie potrzebne żadne rzutowanie klas.
źródło
W czasie wykonywania nic. Ale w czasie kompilacji drugi sprawdzi typ, aby upewnić się, że typ parametru i typ zwracanej wartości są zgodne (lub są podtypami) dowolnego typu T (pierwszy przykład również sprawdza typ, ale każdy obiekt jest podtyp Object, więc każdy typ zostanie zaakceptowany).
źródło
T jest typem ogólnym. Oznacza to, że można go zastąpić dowolnym kwalifikującym się obiektem w czasie wykonywania. Możesz wywołać taką metodę w następujący sposób:
String response = doSomething("hello world");
LUB
MyObject response = doSomething(new MyObject());
LUB
Integer response = doSomething(31);
Jak widać, występuje tu polimorfizm.
Ale jeśli zadeklarowano, że zwraca Object, nie możesz tego zrobić, chyba że wpiszesz rzeczy rzutowane.
źródło
<T>
nie ma autoboxingu?w pierwszym przypadku przyjmuje parametr dowolnego typu egstring i zwraca typ foo. W drugim przypadku przyjmuje parametr typu foo i zwraca obiekt typu foo.
źródło
Istnieje kilka powodów, dla których w Javie można rozważyć generyczne zamiast typu obiektu:
źródło