[英]How to return the Class of a generic type
我有这个编译问题:
这是有问题的课程:
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
}
}
我也试过用
public T getEntityType (){
return T; // doesn't compile
}
但这显然也无效。 有谁知道如何返回该泛型类的类实例?
我也试过这个:
public Class<T> getEntityType (){
return this.model.getClass();
}
我得到:
然后我尝试了这个:
public Class<? extends T> getEntityType (){
return this.model.getClass();
}
我有:
你似乎很困惑。 你将返回代表T的类,而不是T.
让我们用字符串替换T并说明你为什么做的事情毫无意义:
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.
}
为了解释,这个:
public T getEntityType() {
....
}
要求你返回任何T的实际实例。 不是T代表的任何类型。 就像'String'意味着你应该返回一个String的实际实例,而不是String的概念,类型。
也许你打算这样做:
public T getEntityType() {
return model;
}
或者更可能的是,鉴于您将此方法命名为“getEntityType”,您的意思是:
public Class<? extends T> getEntityType() {
return model.getClass();
}
是的, ? extends T
? extends T
,因为模型是T或T的任何子类型。
以下代码怎么样? 我认为它有效。
public Class<? extends BaseModel> getEntityType (){
return model.getClass();
}
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
}
}
部分问题是在Object中定义了getClass以给你一个Class< ? >
Class< ? >
使用通配符作为通用参数。 如果你想返回Class< ? extends T >
Class< ? extends T >
你需要强制转换为:
return (Class< ? extends T >) (model.getClass());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.