Java:在运行时获取泛型参数值

3
什么是检索泛型类的泛型参数的运行时值的最佳方法?例如:
public class MyClass<T> {

  public void printT() {
    // print the class of T, something like:
    // System.out.println(T.class.getName());
  }

}

所以如果我调用

new MyClass<String>().printT() 

它将打印出"字符串"。


为什么这很重要? 如果确实很重要,请不要使用泛型,使用实际类型。 - mP.
4个回答

6

不需要。由于类型擦除,这些信息在运行时(大部分)都会丢失。如果您真的需要该类,则可以执行以下操作:

public class MyClass<T> {
  private final Class<T> clazz;

  public MyClass(Class<T> c) {
    if (c == null) {
      throw new NullPointerException("class cannot be null");
    }
    clazz = c;
  }

  public void printT() {
    System.out.println(clazz.getName());
  }
}

然后您就可以访问它了。


注意:您的示例代码包含一些错误,例如 private final clazz; - 您忘记了变量的类型。 - Jesper

1
为了实现这一点,您需要添加类型信息,因为类型擦除意味着 T 的类型不可用。
public class MyClass<T> {
  private final Class<T> clazz;
  public MyClass(Class<T> clazz) {
    this.clazz=clazz;
  }

  public void printT() {
    // print the class of T, something like:
    System.out.println(this.clazz);
  }
}

1

0

如前所述,由于类型擦除,您无法在该示例中获取类型信息。

但是,您可以重新设计类层次结构,以便拥有通用的超类/接口,并使子类直接在其定义中定义类型参数:

package com;
import java.lang.reflect.ParameterizedType;
import java.util.Arrays;

public class AAA {
    public static void main(String[] args) throws Exception {
        Object target = new MyClass<Integer>() {}; // child class that explicitly defines superclass type parameter is declared here
        ParameterizedType type = (ParameterizedType) target.getClass().getGenericSuperclass();
        System.out.println(Arrays.toString(type.getActualTypeArguments()));
    }
}

class MyClass<T> {
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接