2015-11-05 2 views
1

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

public class TestClass<T> { 
    public T testMethod() { 
     Type type = getClass().getGenericSuperclass(); 
     ParameterizedType paramType = (ParameterizedType) type; 
     Class<T> aClass = (Class<T>) paramType.getActualTypeArguments()[0]; 
    } 
} 

Я получаю эту ошибку во время выполнения

java.lang.Class не может быть приведен к java.lang.reflect.ParameterizedType

Что случилось?

ответ

1

getGenericSuperclass method, как следует из его названия, возвращает Type, который представляет собой суперкласс класса, а не сам класс.

Здесь type является объектом Class для Object, а не TestClass.

Чтобы получить параметры вашего собственного класса, используйте the getTypeParameters method.

+0

Окончательно неправильно поняли использование этого метода, действительно глупо. благодаря – StackOverflower

1

Вы неправильно понимаете, что такое метод getGenericSuperclass(). Речь идет о родовом типе суперкласса, а не о самом классе.

Вот пример его использования.

public class TestClass<T> { 

    // The generic type of the super class of SubClass is TestClass<String> 
    public static class SubClass extends TestClass<String> { 
     public void testMethod() { 
      Type type = getClass().getGenericSuperclass(); 
      System.out.println(type); 
     }; 
    } 

    public static void main(String[] args) { 
     new SubClass().testMethod(); 
    } 
} 

Эта программа печатает:

TestClass<java.lang.String> 

То, что вы, по всей видимости, пытается сделать (получить общий вид с экземпляра во время выполнения) фактически невозможно в Java из-за типа стирания.

Смежные вопросы