我具有用于实现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。
如何获得实施测试所需的价值?
答案 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));
这不是理想的方法,但这是唯一可行的方法!