Как проверить с типом отражения универсального класса - PullRequest
0 голосов
/ 06 марта 2019

У меня есть интерфейс для реализации структуры данных стека:

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 голосов
/ 29 марта 2019

Универсальный тип переменной стирается во время выполнения. Единственный способ, которым вы сможете это сделать, - это специально удерживать тип самостоятельно, т.е. добавить метод в интерфейс стека для получения типа:

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

Затем добавьте тип в качестве конструктора 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));

Это не идеально, но это единственный подход, который сработает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...