Generalnie nie jest to możliwe. Problem staje się jasny, gdy myśl trochę dłużej o swoim scenariuszu. Masz klasę Addressable
i jej metodę hardEquals
, która wymaga, aby jej parametr miał typ równy temu. Masz podklasę, która wydaje się działać zgodnie z przeznaczeniem. Teraz wyobraź sobie podklasę podklasy:
public class GrandChild extends MyAddressable {
void hardEquals(MyAddressable t);
}
Tutaj masz klasę, która musi zaakceptować MyAddressable
jako hardEquals
parametr ', ponieważ nie może przesłonić metodę przez zwężenie typy parametrów, czyli nie przyjmując rzeczy że superklasa została zaakceptowana. W końcu zawsze możesz mieć zmienną typu MyAddressable
, która faktycznie odnosi się do instancji GrandChild
. Nie można ograniczyć parametrów do hardEquals
, aby dopasować rzeczywisty typ środowiska wykonawczego obiektu.
Tak więc pożądany "typ parametru musi odpowiadać this
" konflikt reguł z "podklas metody musi akceptować wszystkie parametry, które nadklasy" reguły.
Należy pamiętać, że często jest to mylone z faktycznym ograniczeniem systemu typu, że to samo nie działa w przypadku typów zwrotu. Ponieważ rodzaje powrotne dozwolone mają być zawężony do podklasy, chęć gwarancji powrotu typ this
może być uzasadnione w niektórych sytuacjach, na przykład:
class Base {
Base/*actually this type*/ clone() { … }
}
class SubClass extends Base {
SubClass/*actually this type*/ clone() { … }
}
class GrandChild extends SubClass {
GrandChild/*actually this type*/ clone() { … }
}
działa, ale nie ma formalnego sposób określić gwarancję, że this
Typ jest zwracany, więc do dyscypliny programisty należy dodać poprawne przesłonięcie każdej podklasy.
Ale, jak powiedział, dla typów parametr to nie działa ogólnie, ponieważ nie można zawęzić typu parametru w podklasie.
Nie można tego poprawnie zrobić, ponieważ oznacza to, że 'MyAddressable' nagle otrzymuje metodę, która akceptuje' Adresowalny' zamiast innego typu, którego klasa nie jest przygotowana do obsługi, '' ten ''typ, jeśli istnieje, może być użyty tylko w kontekście takim jak '? extends this', jak pokazuje to sygnatura 'getClass()'. – Ferrybig