使用参数化类型来确定类型

我正在经历这个链接

Java通用类 – 确定类型

我试过这个程序。

package my; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; public class GenericTypeIdentification { public static void main( String args[] ) { Node obj = new GenericTypeIdentification().new SubNode( 1 ); ParameterizedType parameterizedType = ( ParameterizedType ) obj.getClass().getGenericSuperclass(); Type clazz = parameterizedType.getActualTypeArguments()[0]; if ( clazz == Integer.class ) { System.out.println( 1 ); } else { System.out.println( 2 ); } } class Node { private final T value; public Node( T val ) { this.value = val; } public T evaluate() { return value; }; } class SubNode extends Node { private final T value; public SubNode( T val ) { super( val ); value = val; } @Override public T evaluate() { return value; }; } } 

我的理解是它应该将输出打印为1但它打印2 。 请帮助我理解这一点。 谢谢。

谷歌guice的TypeLiteral中使用了一个真正有用的技巧 。 在generics类的子类的构造函数中,即使在运行时可以访问父级的通用“实例化”…因为在编译时保留了generics类型信息以用于inheritance。 用法示例:

 TypeLiteral test = new TypeLiteral() {}; // notice the {} to build an anon. subclass System.err.println(test.getType()); // outputs "MyClass" 

由于类型擦除,如果不使用generics的子类,这不起作用; 并且对于大多数应用来说可能有点过头了。

在这种情况下,Clazz将是T.

generics仅在java的编译时考虑。 您可以通过查看其成员的类来尝试在运行时确定集合的类型参数的值(没有100%确定性,您最终可以使用子类…)。 无法在运行时确定空集合的类型参数值。