如何检查泛型的反射类型

时间:2019-03-06 18:18:49

标签: java reflection

我具有用于实现Stack数据结构的接口:

public interface Stack<T> {
    void push(T element);
    //other methods
}

以及在其中实施一个或多个实施方式。

?我想为此编写一个测试器,该类的任何示例都可以在其中测试。例如:

class StackImpl<T> implement Stack<T>{
//...
}

对于通话测试,我想写这个:

Tester.<Integer>test(new StackImpl<Integer>());

在测试器中:

public static <T> void test(Object any) {
        if (any instanceof Stack) {
            testQueue((Stack<T>) any);
        }
    }

    private static<T> void testStack(Stack<T> stack) {
        new TestStack<>(stack).invoke();
    }

然后测试堆栈:

public class TestStack<T> implements Test {

    private Stack<T> stack;

    TestStack(Stack<T> stack) {
        this.stack = stack;
    }

    @Override
    public void invoke() {
        //and here need help!
    }
}

在方法invoke()中,我想获取原始的泛型类型,在这种情况下是Integer。

如何获得实施测试所需的价值?

1 个答案:

答案 0 :(得分:0)

在运行时会删除变量的通用类型,唯一可以实现的方法就是自己专门保留该类型,即在堆栈接口中添加方法以获取类型:

public interface Stack<T> {
    ...
    Class<T> getType();
    ...
}

然后在您的impl中将类型添加为构造函数arg:

public class StackImpl<T> implements Stack<T> {
    private final Class<T> type;

    public StackImpl(Class<T> type) {
        this.type = type;
    }

    @Override
    public Class<T> getType() {
        return type;
    }
}

因此,现在您可以访问以下类型:

public class TestStack<T> implements Test {
    private Stack<T> stack;

    TestStack(Stack<T> stack) {
        this.stack = stack;
    }

    public void invoke() {
        System.out.println(stack.getType());
    }
}

并且:

Tester.<Integer>test(new StackImpl<Integer>(Integer.class));

这不是理想的方法,但这是唯一可行的方法!