有没有办法在运行时获取以下类的泛型类型(我将在运行时调用doSomething()
):
class MyClass<D> extends BaseClass<List<D>> {
public Class<D> getGenericClass(){
Type [] ta = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments();
Class ty = (Class) ta[0]; // is java.util.List<D> and throws a cast exception
// TODO I want to know what kind of class "D" is
}
}
class BaseClass<T>
T data;
}
我想使用MyClass
,如下所示:
MyClass<Foo> instance = new MyClass<Foo>();
Class<Foo> foo = instance.getGenericClass();
上面的代码行只是为了向您展示我面临的(简化)场景。如果我手动实例化,那么我就已经知道我使用Foo
作为通用参数,但事实并非如此。
仅供参考我正在尝试处理Android Parcelable
并使用泛型为readParcelable()
获取正确的类加载器。具体:MyClass implements Parcelable
。在阅读Parcel
时,我必须指定类似此data = parcel.readArrayList(Foo.class.getClassLoader)
的类加载器,并且我想通过使用data = parcel.readArrayList(getGenericClass().getClassLoader())
有没有办法获得这种信息?
通常您只需使用:
Class type = (Class) (getClass().getGenericSuperclass()).getActualTypeArguments()[0]);
但返回java.util.List<D>
,但我对<D>
的内容感兴趣。有没有办法深入研究这种泛型类型?
答案 0 :(得分:-1)
您可以尝试类似(来自java.lang.reflect的类):
ParameterizedType pt = (ParameterizedType)MyClass.class.getGenericSuperclass();
Type[] t = pt.getActualTypeArguments();
t
将包含您班级的每种通用类型。
编辑:如果它是一个列表,您可以使用以下内容获取列表类型:
ParameterizedType listType = (ParameterizedType) listField.getGenericType();
Class<?> listClass = (Class<?>) listType.getActualTypeArguments()[0];