Использование getActualTypeArguments в общем контексте - PullRequest
7 голосов
/ 04 ноября 2011

Есть и другие связанные вопросы, например, 6624113 , 3403909 , 4516891 но мой вопрос проще и конкретнее.

Я хочу знать во время выполнения, с каким типом был параметризован мой класс - мне нужен объект Class типа параметра type. Из-за стирания типа выражение T.class не работает, и в C # нет такой функции, как typeof(T), чтобы получить его.

Тем не менее, есть некоторое «сверхотражение», доступное через ParameterizedType и связанные с ним классы, что дает мне почти весь путь туда.

import java.lang.reflect.ParameterizedType;

public class MyClass<T> {
    public static void main( String[] args ) {
        new MyClass<Integer>().printTypeParam();
    }

    public void printTypeParam() {
        class DummyT extends MyClass<T> {}
        class DummyString extends MyClass<String> {}

        ParameterizedType ptT =
            ((ParameterizedType) DummyT.class.getGenericSuperclass() );

        ParameterizedType ptString =
            ((ParameterizedType) DummyString.class.getGenericSuperclass() );

        System.out.println( "DummyT: " + ptT + " " + ptT.getActualTypeArguments()[0] );
        System.out.println( "DummyString: " + ptString + " " + ptString.getActualTypeArguments()[0] );

    }
}

Когда я запускаю вышеупомянутое, я вижу этот вывод:

DummyT: MyClass<T> T
DummyString: MyClass<java.lang.String> class java.lang.String

Как вы можете видеть, это работает, когда аргументы типа известны во время компиляции в строке кода, содержащей вызов getGenericSuperClass, но там, где этот вызов сам имеет дело с обобщениями, он просто печатает имя введите параметр.

Можно ли как-нибудь заставить первую строку напечатать java.lang.Integer вместо T?

1 Ответ

3 голосов
/ 04 ноября 2011

Вы не можете, просто и ясно. Integer не овеществлено, оно полностью стерто . Если вы мне не верите, скомпилируйте файл один раз с Integer и один раз с Long. Два двоичных файла классов будут абсолютно идентичны.

Стирание типа - это суровая реальность, которую вы не сможете обойти. Я предлагаю вам переосмыслить, почему вам нужно , а не идти по пути введения хаков, чтобы попытаться избежать этого.

Полезные темы для часто задаваемых вопросов по AngelikaLanger:

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