Как использовать TypeToken, чтобы получить параметр типа?

Я пытаюсь найти параметр типа во время выполнения, используяTypeToken как показано вГуава документация примерIKnowMyType:

public class Test<E extends Enum<E>> {

    private static enum MyEnum {
        FIRST,
        SECOND
    };

    private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
    };

    public static void main(String[] args) {
        Test<MyEnum> container = new Test<>();
        System.out.println(container.enumType.getRawType());
    }
}

Когда я запускаю этот код, я получаюclass java.lang.Enum в качестве вывода. Почему не получаюclass MyEnum вместо?

Ответы на вопрос(1)

Решение Вопроса

Этот «хак» не будет работать со значением типа времени выполненияTest.

У Java нет способа распространить аргумент типа, определенный при создании вашего экземпляраTest класс здесь

Test<MyEnum> container = new Test<>();

вплоть до декларации

private final TypeToken<E> enumType = new TypeToken<E>(getClass()) {
};

И поэтомуTypeToken понятия не имеет, чтоE следует обратиться к.

Javadoc состояния

Создает токен нового типаT при разрешении переменных свободного типав контекстеdeclaringClass.

Клиенты создают пустой анонимный подкласс. Это позволяет встроить параметр типа в иерархию типов анонимного класса, чтобы мы могли восстановить его во время выполнения, несмотря на удаление.

Вот что вам нужно сделать.

Test<MyEnum> container = new Test<MyEnum>() {
};

Теперь, поскольку классы хранят информацию о своих общих суперклассах,getClass позвонить вTypeToken приведенная выше реализация обеспечивает достаточный контекст дляE быть интерпретированным какMyEnum.

 Sotirios Delimanolis27 июн. 2016 г., 08:17
@Gili Извините, я использовал свой собственный тестовый класс.Sample твойTest, Вы создаете анонимный подклассTest, да.
 Sotirios Delimanolis27 июн. 2016 г., 08:23
@KevinWallis Это синтаксис для анонимных классов.Вот официальный учебник.
 Kevin Wallis27 июн. 2016 г., 08:28
@SotiriosDelimanolis аааTypeToken являетсяabstract так я понимаю. Я думал, почему вы создаетеanonymous учебный класс
 Gili27 июн. 2016 г., 08:45
Осторожно! Эта техника перестает работать, если вы используете фабричные методы:stackoverflow.com/q/38047417/14731
 Gili27 июн. 2016 г., 08:18
Это работает. Спасибо, сэр! :)
 Kevin Wallis27 июн. 2016 г., 08:22
@SotiriosDelimanolis, не могли бы вы объяснить, что{} точно делает. Можете ли вы показать другой пример, где{} используется.
 Sotirios Delimanolis27 июн. 2016 г., 08:29
@KevinWallisВот больше информации о том, как работают токены типа.
 Gili27 июн. 2016 г., 08:15
Я не понимаю Что значитSample ссылаетесь в своем ответе? Вы говорите, что я должен создать подклассSample extends Test и тогда я смогу посмотретьSample.enumType?

Ваш ответ на вопрос