Java: метод переопределения или перегрузки? - PullRequest
5 голосов
/ 29 июня 2011

У меня есть метод в классе с именем «PlaceParser», который extends «ModelParser»:

protected Place parseModel(JSONObject element) ...

Место - это подкласс Model.Следует ли добавить аннотацию @Override в приведенный выше код?Поскольку метод имеет другой тип возвращаемого значения, это все равно считается как переопределение метода базового класса с тем же именем и аргументами / тип возвращаемого значения изменяет «сигнатуру»?

Метод «ModelParser» выглядит следующим образом«ModelT» также расширяет «Model»:

protected abstract ModelT parseModel(JSONObject element)
            throws JSONException;

Обновление @Jon Skeet:

Базовый класс объявлен так:

public abstract class ModelParser<ModelT extends Model> {

Раньше я не видел объявление стиля <ModelT extends Model> для класса.

Ответы [ 3 ]

6 голосов
/ 29 июня 2011

Да, вы должны добавить @Override, так как вы все еще переопределяете метод.Тот факт, что вы используете ковариацию возвращаемых типов, не меняет этого.

В частности, если другой код имеет выражение типа ModelParser и вызывает parseModel(element), они все равно будут полиморфно заканчиваться на ваша реализация.Сравните это с перегрузкой (например, путем добавления другого параметра), где будет вызываться исходная реализация в ModelParser.

3 голосов
/ 06 марта 2015

1) Первое и наиболее важное различие между перегрузкой и переопределением метода заключается в том, что в случае перегрузки метода в Java сигнатура метода изменяется, а в случае переопределения метода остается неизменной.

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

3) Вы не можете переопределить static, final и private метод в Java, но вы можете перегрузить статический, окончательный или закрытый метод в Java.

4) Перегруженный метод в Java связан статической привязкой, а переопределенные методы подвержены динамической привязке.

5) Частный и последний метод также не может быть переопределен в Java.

enter image description here

Подробнее: https://javarevisited.blogspot.com/2011/12/method-overloading-vs-method-overriding.html#ixzz3TbRYYM5z

3 голосов
/ 28 ноября 2011

ПЕРЕГРУЗКА Java, наряду с несколькими языками программирования, позволяет повторно использовать имя метода для более чем одного метода. В некоторых случаях вы можете захотеть написать несколько методов в одном классе, которые выполняют в основном одну и ту же работу с разными аргументами. Когда вы пишете код для вызова одного из методов, соответствующий выбирается в зависимости от типа аргумента или аргументов, которые вы предоставляете. К перегруженным методам применяются два правила:

  1. Тип возвращаемого значения методов может быть другим, но списки аргументов перегруженных методов должны отличаться.
  2. Списки аргументов оператора вызова должны различаться настолько, чтобы можно было однозначно определить правильный метод для вызова.

ПЕРЕЗАГРУЗКА В иерархии классов, когда методы в подклассе имеют то же имя и сигнатуру типа, что и метод в суперклассе, тогда метод в подклассе переопределяет метод в суперклассе. Методы в производном классе могут иметь то же имя, что и у базового класса. Если у вас есть один базовый класс с именем book и для производного класса с именами book1 и book2 и если вы используете одинаковые методы во всех трех классах, то выполняется последний метод производного класса, хотя во всех предыдущих классах есть методы с похожими именами. Концепция в Java называется переопределением.

...