通用类的类

时间:2015-04-19 02:20:22

标签: java android generics

有没有办法在运行时获取以下类的泛型类型(我将在运行时调用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>的内容感兴趣。有没有办法深入研究这种泛型类型?

1 个答案:

答案 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];