Анжелика Лангер говорит в своем FAQ о дженериках (см. Technicalities.FAQ822):
Если методы имеют параметры типа с разными границами, то они не переопределяйте, потому что методы имеют подписи, которые не являются переопределить-эквивалент. Помните, что границы параметров типа являются частью общая сигнатура метода.
Пример (общих методов подтипа, перегружающих общий супертип методы; не рекомендуется):
class Super { public <T> void set( T arg) { ... } public <T> T get() { ... } } class Sub extends Super { public <S extends Number > void set( S arg) { ... } // overloads public <S extends Number > S get() { ... } // overloads }
Я не понимаю, почему метод get
перегружен в классе Sub
. Для того, что я знаю, это должна быть ошибка времени компиляции, потому что get
имеет ту же подпись как в Sub
, так и Super
(тип возврата не является частью этого).
Что еще меня путает, так это то, что IDE, который я использую для тестирования кода (IntelliJ IDEA 14.0.3), выделяет get
в Sub
как ошибку компиляции со следующим сообщением:
'get()' в 'Sub' столкновения с 'get()' в 'Super'; оба метода имеют одно и то же стирание, но не переопределяют другой.
Но когда я запускаю программу, она компилируется и выполняется без проблем. Я полагаю, что есть некоторая ошибка в IntelliJ, когда она анализирует код, и что правильно, что говорит Анжелика в своем FAQ. Но я не могу уловить смысл.