繁体   English   中英

如何返回泛型类的类

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM