2009-10-15 43 views
3

什么是检索泛型参数的运行值泛型类的最佳途径检索泛型参数值?例如:的Java:在运行时

public class MyClass<T> { 

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

} 

所以,如果我叫

new MyClass<String>().printT() 

它会打印 “字符串”

+0

为什么这很重要? 如果真的不重要,请使用实际的类型。 – 2009-10-15 09:39:01

回答

6

你不知道。由于type erasure信息(大部分)在运行时丢失。如果你真的需要这个课程,你可以这样做:

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

然后你有权限访问它。

+0

注意:您的示例代码包含一些错误,如'private final clazz;' - 您忘记了该变量的类型。 – Jesper 2009-10-15 08:49:38

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

由于type erasure,Java在运行时没有这些信息。当实例化对象时,您需要将类型作为构造函数参数传递给类。还有一些图书馆和语言,它可以帮助你做到这一点用更少的打字:Guice can do itScala can do it

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> { 
}