При переопределении метода суперкласса Java позволяет возвращаемому типу быть ковариантным.
Почему контравариантные типы параметров, напротив, не разрешены при переопределении методов?
При переопределении метода суперкласса Java позволяет возвращаемому типу быть ковариантным.
Почему контравариантные типы параметров, напротив, не разрешены при переопределении методов?
Потому что это называется перегрузкой.
В частности, тип возвращаемого типа может быть ковариантным, поскольку он не учитывается при перегрузке и, следовательно, по-прежнему соответствует суперклассу или реализации интерфейса. Параметры учитываются при перегрузке. У вас вполне может быть оптимизация с Number doSomethingWithNumber(Integer value)
по сравнению с Number doSomethingWithNumber(Number value)
.
A extends B
и B extends C
, но B
обеспечивают реализацию void f(Object o)
из вашей ссылки, то A
не имеет возможности реализовать более конкретные перегруженные методы. Это был бы кошмар.
- person pickypg; 15.09.2012
void f(Object o) { if (o instanceof Integer) f((Integer)o); }
. И тогда вы должны спросить, как это вообще работает? Чтобы разрешить поведение переопределения, это означало бы, что метод параметра Object
переопределяет метод параметра Integer
, и, следовательно, приведенный выше код вызовет бесконечный рекурсивный цикл (пока стек не переполнится), поскольку он вернется к методу Object
.
- person pickypg; 15.09.2012
Object
для простого вызова других методов (не переопределений) или реализаций в классе super
, что даст конкретный пункт назначения, отличный от контравариантного переопределения. Это означает, что код будет невероятно ограниченным, и я ожидаю, что количество ошибок здесь будет невероятно ограниченным. Не говоря уже о том, что вы теряете функциональность перегрузки, имея универсальную корзину, которая может появиться за пределами исходного API (в конце концов, сегодня вы могли бы перегрузить эти параметры в базовом классе, чтобы получить желаемое поведение, используя перегрузку и Object
).
- person pickypg; 15.09.2012
Because that's called overloading.
: я чуть со стула не упал, читая это. Спасибо за этот яркий ответ. +1
- person paercebal; 06.06.2013