Prosta wikipedia: tu wszystko jasne jest jak ktoś rozumie sam kod w javie.
I proces tworzenia obiektów, przydzielania im pamięci przez JVM ... i czasu kiedy np JVM wymusza utworzenie obiektu, kiedy tworzony jest "leniwie" czyli nie w momencie np deklaracji ale dopiero kiedy używamy
Poniższy przykład w języku Java wykorzystuje pakiet java.lang.reflect.
Dzięki mechanizmowi refleksji możesz dowiedzieć się jakie klasy/metody/pola itp. zawiera program, w trakcie jego wykonywania.
// bez refleksji
Foo foo = new Foo();
foo.hello();
// z refleksją
Class cl = Class.forName("Foo");
Method method = cl.getMethod("hello");
method.invoke(cl.newInstance());
Oba fragmenty tworzą instancję klasy Foo, następnie wywołują metodę hello() tej klasy. Różnica polega na tym, że w pierwszym fragmencie nazwa klasy i metody są częścią kodu źródłowego, podczas gdy w drugim fragmencie możliwe jest przeniesienie ich do zmiennych, których wartość jest ustalana w czasie wykonania kodu.
Więc tutaj z Typami generyczny,i jest inaczej: ... W MOMENCIE wykonywania pracy Kompilator Java automatycznie sam dobiera sobie "odpowiedni typ", ale do momentu tej akcji kompilator nie wie ... na bazie wstępnego załadowania klas do pamięci i przydzielania im zasobu, przestrzeni [ nie wie co kryje się pod typem generycznym ] a w refleksji z góry narzucone jest to i kompilator wie co robi.
Też trzeba to zrozumieć na tej zasadzie, że kod w JVM najpierw jest interpretowany na BYTE COD... przechodzi to przez CLASS LOADERY itd- z rozumienie tego daje dużą odpowiedź, bo mając pliki.class* które tworzysz po kompilacji bez uruchomienia zawierają juz wszystkie informacje dotyczące pamięci, obiektów, numerów itd itp
rodzaju typów generycznych.
ja nie widzę ani jednego powiązania z refleksją a typem generycznym...
typy generyczne są “szablonami”. Dzięki typom generycznym możemy uniknąć niepotrzebnego rzutowania. Ponadto przy ich pomocy kompilator jest w stanie sprawdzić poprawność typów na etapie kompilacji, oznacza to więcej błędów wykrytych w jej trakcie1.
Więc tutaj całkiem inna bajka bo gdyby nie ten fakt, musiałbyś implementować tyle interfejsów np ile masz typów dla danego zbioru, popatrz ile to robi się pracy i niepotrzebnych rzeczy skoro np osobny interfejs ( mam tu bardziej na myśli klase implementującą interfejs ) musiałbyś stworzyc dla typu Integer i Double mający te same funkcje,operacje itd...