获得通用类型的“真实”类

如何获得generics类型的“真实”类?

例如:

public class MyClass { public void method(){ //something System.out.println(T.class) //causes a compile error, I wont the class name //something } } 

如果T =整数

输出:

 java.lang.Integer 

如果T = String

输出:

 java.lang.String 

谢谢

如果你的类中有一个类型为T的实例变量,并且碰巧设置了它,那么你可以打印该变量的类。

 public class Test { T var; public static void main(String[] args) { Test a = new Test(); System.out.println(a.boo()); a.setVar(new Integer(10)); System.out.println(a.boo()); } public String boo() { if (var == null) { return "Don't know yet"; } return var.getClass().getSimpleName(); } public void setVar(T var) { this.var = var; } public T getVar() { return var; } } 

你不能。 在编译时从代码中剥离信息,这个过程称为类型擦除。 有关更多信息,请查看此处: 类型擦除

编辑:抱歉我的不好,在运行时没有加载信息。

正如其他人所解释的那样,你不能以这种方式去做,但这就是它通常在java中实现的方式。

 public class MyClass { public void method(Class clazz) { // something System.out.println(clazz.getName()); // something } } 

你就这样使用它

 new MyClass().method(String.class); 

在你的情况下,你不能。 但是,您可能可以将超类型标记用于此类事物: http : //gafter.blogspot.com/2006/12/super-type-tokens.html

这些的示例实现是Jackson json处理库的TypeReference类。

这是高级的东西,可能比你想知道的更多;-)

请注意,依赖于使用generics类型接收的实例上的’getClass()’的方法将获得该对象的实际类型,这不一定是generics类型 – 这是调用者知道该实例的类型。

例如,考虑调用者通过接口处理对象的情况; 传递给generics构造时,generics类型将是接口,而不是实例的实际类。

考虑以下示例“Pair”类,它允许通过POJO返回两个对象引用:

 public class Pair { public final U first; public final V second; public static  Pair of (U first, V second) { return new Pair (first, second); } protected Pair (U first, V second) { this.first = first; this.second = second; } } 

我们正在考虑如何修改’Pair.of()’工厂函数以返回Comparable Pair派生类,如果U和V都是Comparable。 然而,虽然我们可以使用instanceof来判断“第一”和“第二”是否具有可比性,但我们不知道“U”和“V”本身是可比较的。

为此,Pair.of()返回的Pair的确切类型必须依赖于generics类型, 而不是实际的参数类型。