Java: getClass () typu ograniczonego
Zauważyłem coś, kiedy śmiałem się z generykami. W poniższym przykładzie,doStuff1
kompiluje, aledoStuff2
nie:
public <T extends Foo> void doStuff1(T value) {
Class<? extends Foo> theClass = value.getClass();
}
public <T extends Foo> void doStuff2(T value) {
Class<? extends T> theClass = value.getClass();
}
Sprawdziłem więc dokumentacjęObject.getClass()
i znalazłem to:
Rzeczywisty typ wyniku to Klasa <? extends | X |> gdzie | X | jest kasowaniem statycznego typu wyrażenia, na które wywoływana jest getClass.
To mnie trochę ciekawiło. Dlaczego jestgetClass()
zaprojektowany w ten sposób? Rozumiem konwersję typów do ich klas surowych, jeśli ma to zastosowanie, ale nie widzę żadnego oczywistego powodu, dla którego koniecznie musieliby to również zabićT
. Czy jest jakiś konkretny powód, dla którego również się go pozbywa, czy też jest to tylko ogólne „pozbądźmy się wszystkiego, bo jest łatwiej; kto i tak by go potrzebował”?