Java 混凝土类的泛型

Java 混凝土类的泛型,java,generics,Java,Generics,如何从具体类中获取泛型类型。例如,我有: class MyClass<String> { public Type getGenericType { // how can I return String.class in here? } } class-MyClass { 公共类型getGenericType { //在这里如何返回String.class? } } 我可以用抽象类这样做: abstract class MyClass<String>

如何从具体类中获取泛型类型。例如,我有:

class MyClass<String>
{
 public Type getGenericType
 {
      // how can I return String.class in here?
 }
}
class-MyClass
{
公共类型getGenericType
{
//在这里如何返回String.class?
}
}
我可以用抽象类这样做:

abstract class MyClass<String>
{    
   public Type getGenericType
   {
     Type t = this.getClass().getGenericSuperclass();
     return ((ParameterizedType)t).getActualTypeArguments()[0];
   }
}
public class MyClass<T> {

    private final Class<T> type;

    @SuppressWarnings("unchecked")
    public MyClass() {
       type = (Class<T>) this.getClass();
    }

    public Class<T> getGenericType() {
     return type;
    }

}
抽象类MyClass
{    
公共类型getGenericType
{
类型t=this.getClass().getGenericSuperclass();
返回((ParameterizedType)t.getActualTypeArguments()[0];
}
}
如何像抽象类一样对具体类执行类似的操作。如果我不能,你能解释为什么吗


谢谢,

您不能这样做,因为一旦代码被编译,泛型就不再存在了。
您的
字符串
实际上变成了
对象


当您的代码试图在编译后运行时,这显然会导致问题…

请尝试以下操作:

abstract class MyClass<String>
{    
   public Type getGenericType
   {
     Type t = this.getClass().getGenericSuperclass();
     return ((ParameterizedType)t).getActualTypeArguments()[0];
   }
}
public class MyClass<T> {

    private final Class<T> type;

    @SuppressWarnings("unchecked")
    public MyClass() {
       type = (Class<T>) this.getClass();
    }

    public Class<T> getGenericType() {
     return type;
    }

}
公共类MyClass{
私有最终类类型;
@抑制警告(“未选中”)
公共MyClass(){
type=(Class)this.getClass();
}
公共类getGenericType(){
返回类型;
}
}

在此阶段,Java不支持泛型。但是,可以在运行时获取字段和方法的参数类型信息。对这件事有很好的了解。对于类,通常可以方便地将参数类型显式地传递到构造函数中:

class ClassWithParameter<T> {
 private final Class<T> parameterType;

 public ClassWithParameter(final Class<T> parameterType) {
      this.parameterType = parameterType;
 }
 ... }
ClassWithParameter类{
私有final类参数type;
公共类WithParameter(最终类参数类型){
this.parameterType=parameterType;
}
... }

或者,可以创建一个带有Class属性的自定义运行时注释,并用于注释类,这些类在运行时需要参数类型信息。

您的示例没有真正意义。
String
是否为此处的类型参数?为什么选择“字符串”而不是不太可能引起混淆的东西?按照惯例,类型参数是单个字母,例如
E
T
。您是对的。通常我会使String=T,但为了说明我的观点,我把它放在这里,构造函数和成员什么都不做。如果这样做有效,那么
公共类getGenericType(){返回this.getClass();}