我有这个编译问题:
这是有问题的课程:
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();
}
我有:
答案 0 :(得分:6)
您似乎很困惑。您将返回代表T而不是T的类。
让我们用String替换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代表什么类型。就像“字符串”一样,您应该返回字符串的实际实例,而不是字符串的概念(类型)。
也许您打算这样做:
public T getEntityType() {
return model;
}
或更可能的是,假设您将此方法命名为“ getEntityType”,那么您的意思是:
public Class<? extends T> getEntityType() {
return model.getClass();
}
是的,? extends T
,因为模型是T或T的任何子类型。
答案 1 :(得分:2)
下面的代码呢?我认为可以。
public Class<? extends BaseModel> getEntityType (){
return model.getClass();
}
答案 2 :(得分:1)
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
}
}
答案 3 :(得分:1)
部分问题是getClass是在Object中定义的,以便为您提供一个Class< ? >
,且通配符作为通用参数。如果您想返回Class< ? extends T >
,则需要强制执行以下操作:
return (Class< ? extends T >) (model.getClass());