Ответ 1
Это работает:
public static class Bar extends Foo<String> {
public Class<?> getParameterClass() {
return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
}
}
Есть ли способ получить объект класса из переменной типа в классе Generic Java? Что-то вроде этого:
public class Bar extends Foo<T> {
public Class getParameterClass() {
return T.class; // doesn't compile
}
}
Информация о типе доступна во время компиляции и поэтому не должна затрагиваться стиранием типа, поэтому теоретически, должен быть способ сделать это. Он существует?
Это работает:
public static class Bar extends Foo<String> {
public Class<?> getParameterClass() {
return (Class<?>) (((ParameterizedType)Bar.class.getGenericSuperclass()).getActualTypeArguments()[0]);
}
}
Фрагмент кода немного запутан. Является ли 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 вызовет исключение.
Этот код также работает для производных классов:
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/...