J'ai ce problème de compilation:
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:
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:
4 Réponses :
Et le code suivant. Je pense que cela fonctionne.
public Class<? extends BaseModel> getEntityType (){ return model.getClass(); }
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.
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.
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 } }
Ajoutez quelques explications avec votre code. Les réponses au code uniquement ne sont pas très utiles.
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());
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 /…