1

我正在通过这个链接

Java 泛型类 - 确定类型

我试过这个程序。

package my;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

public class GenericTypeIdentification {

    public static void main( String args[] ) {
        Node<Integer> obj = new GenericTypeIdentification().new SubNode<Integer>( 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<T> {

        private final T value;

        public Node( T val ) {
            this.value = val;
        }

        public T evaluate() {
            return value;
        };

    }

    class SubNode<T> extends Node<T> {

        private final T value;

        public SubNode( T val ) {
            super( val );
            value = val;
        }

        @Override
        public T evaluate() {
            return value;
        };
    }
}

我的理解是它应该 printh output as1但它会打印2. 请帮助我理解这一点。谢谢。

4

2 回答 2

3

google guiceTypeLiteral中使用了一个实际有效的技巧。在泛型类的子类的构造函数中,您确实可以访问父类的泛型“实例化”,即使在运行时也是如此……因为泛型类型信息已在编译时保留用于继承目的。示例用法:

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

由于类型擦除,如果不使用泛型的子类,这将不起作用;对于大多数应用程序来说可能是矫枉过正。

于 2013-09-04T09:53:51.537 回答
1

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

泛型仅在 java 中的编译时被考虑。您可以尝试在运行时通过查看其成员的类来确定集合的类型参数的值(没有 100% 的确定性,您最终可以得到一个子类......)。没有办法在运行时确定空集合的类型参数值。

于 2013-09-04T09:44:24.290 回答