[英]How to check with reflection type of generic class
我有實現堆棧數據結構的接口:
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()
我想獲取Original泛型類型,在這種情況下為Integer。
如何獲得實施測試所需的價值?
在運行時將擦除變量的通用類型,您唯一能做到的就是自己專門保留該類型,即在堆棧接口中添加方法以獲取類型:
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));
這不是理想的方法,但這是唯一可行的方法!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.