Pierwsze wywołanie przechodzi instancję anonimowej podklasy ArrayList<Integer>
. Tak, to jest podobny do:
class YourClass extends ArrayList<Integer>
i wywołanie metody jak:
printType(new YourClass());
generycznego nadklasą YourClass
lub anonimową klasę w Twoim przypadku jest tylko ArrayList<Integer>
. Tak, to wyjście jest jasne.
Jeśli chodzi o drugi przypadek, użytkownik przekazuje instancję o numerze ArrayList<Integer>
. I definicja tej klasy wygląda następująco:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
Więc, rodzajowy nadklasą tutaj jest AbstractList<E>
.
konkretyzacji typu generic zakładowego samym Class
przykład:
Zauważ, że wszystkie instancji z ArrayList
dzielić tę samą klasę w czasie wykonywania:
new ArrayList<Integer>().getClass() == new ArrayList<String>().getClass();
Powyższe porównanie daje true
. Ponieważ zarówno getClass()
wywołanie daje powrotem do Ciebie:
class java.util.ArrayList
Zobacz JLS 8.1.2: Generic Classes and Type Parameters:
Ogólny deklaracja klasy definiuje zestaw typów parametrycznych (§4.5), po jednym dla każdej możliwej wezwaniem typu parametr sekcja według argumentów typu. Wszystkie te sparametryzowane typy mają tę samą klasę w czasie wykonywania.
Na przykład, wykonując kod:
Vector<String> x = new Vector<String>();
Vector<Integer> y = new Vector<Integer>();
boolean b = x.getClass() == y.getClass();
spowoduje zmiennej b
posiadających wartość true
.
Innymi słowy, getGenericSuperClass()
metoda nie daje rzeczywisty typ argumentu używanego podczas tworzenia instancji swoją klasę, ale parametr typu stosowanego w klasie jest rozciągającej. Teraz, ponieważ ogólna nadklasa java.util.ArrayList
jest AbstractList<E>
. I dlatego parametr typu otrzymasz tylko E
.
co próbujesz zrobić? –
cóż, drukujesz typeparameter z listy –
Próbuję uzyskać parametr typu w środowisku wykonawczym –