Добрый день. Читал главу Хорстманна об обобщениях, там рассказывалось о принципе действия мостовых методов для обобщенных методов.
(класс Pair - просто обобщенный класс с двумя полями переменного типа)
class Datelnterval extends Pair<Date>
{
public void setSecond(Date second){
if (second.compareTo(getFirst()) >= 0)
super.setSecond(second);
}
• • •
}
public static void main(String[] args){
Datelnterval interval = new Datelnterval(. . .);
Pair<Date> pair = interval; // допускается присваивание суперклассу
pair.setSecond(aDate) ;
}
Предполагается, что вызов метода setSecond () является полиморфным, и поэ
тому вызывается соответствующий метод. А поскольку переменная pair ссылается
на объект типа Datelnterval, это должен быть вызов Datelnterval. setSecond ().
Но дело в том, что стирание типов мешает соблюдению принципа полиморфизма.
В качестве выхода из этого затруднительного положения компилятор формирует сле
дующий мостовой метод в классе Datelnterval:
public void setSecond(Object second) { setSecond((Date) second); }
Для того чтобы стал понятнее этот механизм, проанализируем выполнение при
веденного ниже оператора.
pair.setSecond(aDate)
В объявлении переменной pair указан тип Pair, и к этому типу отно
сится только один метод под именем setSecond, а именно setSecond (Object).
Виртуальная машина вызывает этот метод для того объекта, на который ссылается
переменная pair. Этот объект относится к типу Datelnterval, и поэтому вызыва
ется метод Datelnterval. setSecond (Object). Именно он и является синтезирован
ным мостовым методом. Ведь он, в свою очередь, вызывает метод Datelnterval.
setSecond (Date), что, собственно говоря, и требуется.
Хочется узнать, разве имея ссылку родительского класса на объект наследника, где и тот и другой без переменных класа, не выполняется такая же процедура (очевидно, что не выполняется, раз именно в этой главе описываются эти самые мостовые методы) ?
Прошу прощения, если вопрос поставлен некорректно, оперируемые структуры кажутся довольно запутанными.