Аргумент в переопределенном методе с общим типом возвращаемого типа вызывает переопределение с ошибкой [duplicate]

Подводя итог советам на этой странице, я закончил со следующим:

keytool -genkeypair -keystore ~/.android/release.keystore -alias <my_alias> -storepass <my_cert_pass> -keyalg RSA

Затем я получил набор вопросов относительно имени, организации, местоположения и пароля для моего псевдонима.

17
задан Sean Van Gorder 11 May 2018 в 19:44
поделиться

2 ответа

Согласно выходному сигналу компилятора, в обоих примерах сигнатуры методов различны (скомпилируйте код с опцией -Xlint:unchecked, чтобы подтвердить его):

<X>getSupplier() in A (m2)
                                 1st snippet
getSupplier()    in B (m1)


<X>getSuppliers(Collection<String> strings) in A (m2)
                                                           2nd snippet
getSuppliers(Collection<String> strings)    in B (m1)

Согласно JLS , сигнатура метода m1 является поднайбой подписи сигнатуры метода m2, если либо:

  • m2 имеет ту же подпись, что и m1 , или
  • подпись m1 такая же, как стирание подписи m2.

Первое утверждение выходит из игры - метод подписи разные. Но как насчет второго утверждения и стирания?

Valid Override

B.getSupplier() (m1) является подъявлением A.<X>getSupplier() (m2), потому что:

  • подпись m1 такая же, как стирание сигнатуры m2

<X>getSupplier() после стирания равно getSupplier().

Недопустимое переопределение

B.getSuppliers(...) (m1) не является поднаклейкой A.<X>getSuppliers(...) (m2), потому что:

  • подпись m1 не совпадает с стиранием сигнатуры m2

Подпись m1:

getSuppliers(Collection<String> strings);

Утечка сигнатуры m2 :

getSuppliers(Collection strings);

Изменение аргумента m1 от Collection<String> до необработанного Collection устраняет ошибку, в этом случае m1 становится поднаклейкой m2.

Заключение

1-й фрагмент кода (действительный переопределение) : сигнатуры метода в родительском и дочернем классах отличаются изначально. Но после применения стирания к родительскому методу подписи становятся одинаковыми.

2-й фрагмент кода (недопустимое переопределение) : сигнатуры метода первоначально отличаются и остаются разными после применения стирать родительский метод.

5
ответ дан Oleksandr 16 August 2018 в 11:27
поделиться

В тот момент, когда вы добавили параметр, он переставал быть переопределяющим и стал перегрузкой.

Дженерики не имеют к этому никакого отношения.

1
ответ дан user207421 16 August 2018 в 11:27
поделиться
  • 1
    Для меня это не имеет смысла. Вы в основном говорите, что методы с параметрами не могут переопределить другие методы, что, очевидно, неверно. – lexicore 12 May 2018 в 05:43
  • 2
    @lexicore Нет, я этого не делал. Прочитайте то, что я на самом деле написал. Я сказал, что добавление параметра делает его перегрузкой вместо переопределения. Это по определению, и довольно основательно. – user207421 12 May 2018 в 08:21
  • 3
    Какие параметры изменены между A.getSuppliers и B.getSuppliers? – lexicore 12 May 2018 в 08:24
Другие вопросы по тегам:

Похожие вопросы: