4
votes

Comment renvoyer la classe d'un type générique

J'ai ce problème de compilation:

 entrez la description de l'image ici

Voici la classe en question:

  public Class<? extends T> getEntityType (){
    return this.model.getClass();
  }

J'ai aussi essayé d'utiliser

  public Class<T> getEntityType (){
    return this.model.getClass();
  }

mais cela ne fonctionne clairement pas non plus. Quelqu'un sait-il comment je peux renvoyer l'instance de classe de ce type générique?

J'ai aussi essayé ceci:

 public T getEntityType (){
    return T;  // doesn't compile
 }

et j'obtiens:

 entrez la description de l'image ici

puis j'ai essayé ceci:

package huru.entity;

import io.vertx.core.json.JsonObject;
import java.util.Date;

public class BaseEntity <T extends BaseModel> extends JsonObject {

  private T model;

  public BaseEntity(T m){
    this.model = m;
  }

  public void setUpdateInfo(String user){
    this.model.updatedBy = user;
    this.model.updatedAt = new Date();
  }

  public JsonObject toJsonObject(){
    return JsonObject.mapFrom(this.model);
  }

  public T getEntityType (){
    return this.model.getClass();  // doesn't compile
  }

}

et j'ai:

 entrez la description de l'image ici


2 commentaires

Je dois renvoyer la classe du modèle, pas l'instance du modèle ... la dernière tentative que j'ai semble la plus proche, mais pas tout à fait correcte.


Essayez ici: stackoverflow.com/ questions / 3403909 /…


4 Réponses :


1
votes

Et le code suivant. Je pense que cela fonctionne.

 public Class<? extends BaseModel> getEntityType (){
    return model.getClass();  
 }


2 commentaires

ouais cela a fonctionné, je me demande pourquoi. T devrait fonctionner, c'est peut-être une lacune de la langue.


Je pense que cela a quelque chose à voir avec l'effacement de type. Les informations sur le type ne sont pas disponibles au moment de l'exécution.



6
votes

Vous semblez confus. Vous retournez la classe qui représente T, pas un T.

Remplaçons T par String et montrons pourquoi ce que vous faites n'a aucun sens:

public Class<? extends T> getEntityType() {
    return model.getClass();
}

Pour essayez d'expliquer ceci:

public T getEntityType() {
    return model;
}

vous oblige à renvoyer une instance réelle de tout ce que T est. Pas ce que le type T représente. Tout comme "String" signifie que vous devez renvoyer une instance réelle de String, pas le concept de String, le type.

Peut-être que vous vouliez faire ceci:

public T getEntityType() {
    ....
}

ou plus probablement, étant donné que vous avez nommé cette méthode 'getEntityType', ce que vous voulez dire est ceci:

private String model;

public String getEntityType() {
    return model.getClass();
    // Of course this does not work; model.getClass() is not a string!
}

public String getEntityType() {
    return String;
    // This doesn't even compile.
}

Oui, ? étend T , car le modèle est un T, ou tout sous-type de T.


0 commentaires

1
votes
class Foo<T> {
final Class<T> typeParameterClass;

public Foo(Class<T> typeParameterClass) {
    this.typeParameterClass = typeParameterClass;
}

public void bar() {
    // you can access the typeParameterClass here and do whatever you like
 }

}

1 commentaires

Ajoutez quelques explications avec votre code. Les réponses au code uniquement ne sont pas très utiles.



0
votes

Une partie du problème est que getClass est défini dans Object pour vous donner une Class > avec un caractère générique comme paramètre générique. Si vous voulez retourner Class étend T> vous devrez effectuer un cast vers cela:

return (Class< ? extends T >) (model.getClass());


0 commentaires