簡體   English   中英

如何檢查泛型的反射類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM