usos usar referencia puede metodo llamar donde cuando constructores como clase java generics methods typesafe generic-method

java - referencia - ¿cuando se puede usar el constructor super()?



Diferencia entre la clase super genérica y el tipo de clase super (4)

No puedo entender la diferencia entre los dos fragmentos de código a continuación. ¿Puede alguien ayudarme con una explicación simple?

En primer lugar, debo decir que tengo muchas clases que extienden una clase BaseEntity llamada BaseEntity , así que, ¿cuáles son las diferencias, los beneficios y los inconvenientes de los siguientes fragmentos?

// 1 public <T extends BaseEntity> T getName(T t) { return t; } // 2 public BaseEntity getName(BaseEntity t) { return t; }


1) En su primer código, tiene un método de Restricciones de retorno que debe ser subclasses de BaseEntity y el BaseEntity entrada debe ser la misma subclase de BaseEntity .

2) En su segundo código tiene el retorno y el parámetro del método debe ser subclasses de BaseEntity .


El primer fragmento es más flexible, ya que conserva el tipo real de T Supongamos que tienes una subclase:

class SubEntity extends BaseEntity {}

En el primer caso puedes escribir:

SubEntity result = getName(new SubEntity());

Pero en el segundo caso necesitarás un reparto:

SubEntity result = (SubEntity)getName(new SubEntity());


La principal diferencia cuando se utilizan los dos métodos es la posible necesidad de realizar el lanzamiento en el segundo caso.

Digamos que tienes:

public class MyEntity extends BaseEntity { }

Con el primer método puedes tener algo como:

MyEntity myEntity = ... MyEntity entity = getName(myEntity);

Mientras que con el segundo método tendrías que escribir:

MyEntity entity = (MyEntity)getName(myEntity);

Esto se debe a que especifica el tipo concreto en su primer método.


Me sorprende que nadie haya mencionado esto en las respuestas anteriores, pero hay una diferencia más fundamental entre las dos declaraciones de métodos (que es la razón de la necesidad de la conversión en el segundo caso). Esta diferencia es irrelevante para los métodos triviales que ha proporcionado aquí, pero podría hacer una diferencia para un método que hace algo diferente de simplemente devolver su argumento.

Su primera declaración de método requiere que el tipo de retorno sea del mismo tipo que el argumento pasado.

public <T extends BaseEntity> T getName(T t) { return new SubEntity(); // Where SubEntity extends BaseEntity }

falla al compilar mientras que

public BaseEntity getName(BaseEntity t) { return new SubEntity(); // Where SubEntity extends BaseEntity }

es totalmente legal, incluso si la BaseEntity pasada en el método es un tipo completamente diferente de SubEntity .