Подтвердить что ты не робот

Объект класса Java из переменной типа

Есть ли способ получить объект класса из переменной типа в классе Generic Java? Что-то вроде этого:

public class Bar extends Foo<T> {
    public Class getParameterClass() {
        return T.class; // doesn't compile
    }
}

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

4b9b3361

Ответ 1

Это работает:

public static class Bar extends Foo<String> {
  public Class<?> getParameterClass() {
    return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
  }
}

Ответ 2

Фрагмент кода немного запутан. Является ли T параметром типа или классом?

public static class Bar extends Foo<String> {
    public Class<?> getParameterClass() {
        return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
    }
}

public static class Bar2<T> extends Foo<T> {
    public Class<?> getParameterClass() {
        return (Class<?>) (((ParameterizedType)Bar2.class.getGenericSuperclass()).getActualTypeArguments()[0]);
    }
}


public static void main(String[] args) {
    System.out.println(new Bar().getParameterClass());
    System.out.println(new Bar2<Object>().getParameterClass());
}

На самом деле второй println вызовет исключение.

Ответ 3

Этот код также работает для производных классов:

import java.lang.reflect.ParameterizedType;

public abstract class A<B> 
{
    public Class<B> getClassOfB() throws Exception 
    {
        ParameterizedType superclass = (ParameterizedType) getClass().getGenericSuperclass();

        return (Class<B>) superclass.getActualTypeArguments()[0];
    }
}

застрял отсюда: fooobar.com/info/98045/...