如何返回泛型的类

时间:2019-01-28 04:20:30

标签: java vert.x

我有这个编译问题:

enter image description here

这是有问题的课程:

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();
  }

我得到:

enter image description here

然后我尝试了这个:

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

我有:

enter image description here

4 个答案:

答案 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());