2011-06-29 10 views
5

tengo un método, en una clase llamada "PlaceParser" que extends "ModelParser":Java: método de anulación o sobrecarga?

protected Place parseModel(JSONObject element) ... 

Un lugar es una subclase del modelo. ¿Se debe agregar la anotación @Override al código anterior? Como el método tiene un tipo de devolución diferente, ¿esto todavía cuenta como anulación del método de clase base con el mismo nombre y argumentos/el tipo de devolución altera la 'firma'?

El método "ModelParser" se parece a esto "ModelT" se extiende también "Modelo":

protected abstract ModelT parseModel(JSONObject element) 
      throws JSONException; 

actualización @ Jon Skeet: clase

La base está declarada como esto:

public abstract class ModelParser<ModelT extends Model> { 

No había visto ninguna <ModelT extends Model> declaración de estilo para una clase anterior.

+0

Ver http://stackoverflow.com/questions/1882584/what-is-a-covariant-return-type. (No * exactamente * su caso, porque 'Place' no extiende' ModelT'.) –

+0

@Eli: sospecho que Place realmente extiende el ModelT, de lo contrario este código no se compilaría. (O ModelT es un parámetro de tipo genérico ...) –

+0

@Jon: He actualizado la pregunta. Le agradecería mucho que me explicara la relación entre 'ModelT' y' Place'. – Mikaveli

Respuesta

6

Sí, debe agregar @Override, ya que todavía está anulando el método. El hecho de que está utilizando la covarianza de los tipos de devolución no cambia eso.

En particular, si otro código tiene una expresión de tipo ModelParser y llama parseModel(element) van a terminar siendo polimórfica en su aplicación . Compare eso con sobrecargando (por ejemplo, agregando otro parámetro) donde se llamaría la implementación original en ModelParser.

3

OVERLOADING Java, junto con varios lenguajes de programación, le permite reutilizar el nombre de un método para más de un método. En algunas circunstancias, es posible que desee escribir varios métodos en la misma clase que básicamente hacen el mismo trabajo con diferentes argumentos. Cuando escribe código para llamar a un método, se elige el apropiado de acuerdo con el tipo de argumento o argumentos que proporcione. Dos reglas se aplican a métodos sobrecargados:

  1. El tipo de retorno de los métodos puede ser diferente, pero las listas de argumentos de métodos sobrecargados deben diferir.
  2. Las listas de argumentos de la instrucción de llamada deben ser lo suficientemente diferentes como para permitir una determinación inequívoca del método adecuado para llamar.

PRIMER ORDEN En la jerarquía de clases, cuando un métodos en una clase sub tiene el mismo nombre y tipo de firma como método en la superclase, entonces el método en la subclase se dice que reemplazar el método en superclase. Los métodos en la clase derivada pueden tener el mismo nombre que el de la clase base. Si tiene una clase base llamada book y una clase derivada llamada book1 y book2 y si usa los mismos métodos en las tres clases, se ejecuta el último método de clase derivado, aunque hay métodos con nombres similares en todas las clases anteriores. El concepto en Java se llama Overriding.

3

1) La primera y más importante diferencia entre la sobrecarga de método y la anulación es que, en caso de sobrecarga de método en Java, la firma del método cambia, mientras que en el caso del método se mantiene igual.

2) La segunda gran diferencia entre la sobrecarga de métodos frente a la sobrescritura en Java es que puede sobrecargar el método en una clase, pero la anulación solo se puede hacer en la subclase.

3) No puede anular el método estático, final y privado en Java, pero puede sobrecargar el método estático, final o privado en Java.

4) El método sobrecargado en Java está unido por enlace estático y los métodos reemplazados están sujetos a enlace dinámico.

5) El método privado y final tampoco se puede anular en Java. enter image description here

Leer más: http://javarevisited.blogspot.com/2011/12/method-overloading-vs-method-overriding.html#ixzz3TbRYYM5z