Java:覆盖或重载方法?

Mic*_*ael 5 java inheritance overriding annotations overloading

我有一个方法,在名为"PlaceParser"的类中,extends"ModelParser":

protected Place parseModel(JSONObject element) ...
Run Code Online (Sandbox Code Playgroud)

Place是Model的子类.是否应将@Override注释添加到上面的代码中?由于该方法具有不同的返回类型,这仍然算作覆盖具有相同名称和参数的基类方法/返回类型是否改变了"签名"?

"ModelParser"方法看起来像"ModelT"也扩展了"Model":

protected abstract ModelT parseModel(JSONObject element)
            throws JSONException;
Run Code Online (Sandbox Code Playgroud)

更新@Jon Skeet:

基类声明如下:

public abstract class ModelParser<ModelT extends Model> {
Run Code Online (Sandbox Code Playgroud)

我以前没见过类的<ModelT extends Model>样式声明.

Jon*_*eet 6

是的,您应该添加@Override,因为您仍在覆盖该方法.您使用返回类型的协方差这一事实并未改变这一点.

特别是,如果其他代码具有类型ModelParser和调用的表达式,parseModel(element)它们仍将在您的实现中以多态方式结束.将其与重载(例如,通过添加另一个参数)进行比较,其中ModelParser将调用原始实现.