获取泛型类型的数组类

时间:2015-06-25 13:30:01

标签: java arrays generics

我有一个泛型类。 import java.lang.reflect.Array;

public abstract class MyClass<T> {

    private Class<T> clazz;
    private Class<?> arrayClazz;

    public MyClass() {
        clazz = ClassUtils.getParameterizedClass(getClass());
        arrayClazz = Array.newInstance(clazz, 0).getClass();
    }
}

Utils方法读取给定类的泛型类型,因此我不必将相同的类作为构造函数参数传递。我想要实现的是获得数组类的clazz。

例如,如果T是String,那么

clazz = String.class;
arrayClazz = String[].class;

我目前通过创建T []的新实例并读取它的类来解决它。我想知道是否有更好的方法,或者这种方法是否有任何缺点。

更新

我正在尝试做什么:我有一个从服务器请求JSON的通用DataProvider。我使用GSON来解析响应。

public abstract class DataProvider<T> {

    private final Class<T> resourceClass;
    private final Class arrayClass;


    protected DataProvider() {
        this.resourceRootPath = resourceRootPath;
        this.resourceClass = ClassUtils.getParameterizedClass(getClass());
        arrayClass = Array.newInstance(resourceClass, 0).getClass();
    }

    public void get(String id) {
        ...
        T obj = gson.fromJson(response.body().charStream(), resourceClass)
        ...
    }

    public void list(String id) {
        ...
        T[] objs = gson.fromJson(response.body().charStream(), arrayClass)
        ...
    }
}

1 个答案:

答案 0 :(得分:1)

你应该查看Type Erasure,这可能会妨碍你做出你所要求的干净方式。 (泛型可以帮助你。)

问题是在Java中,在编译时使用泛型类型数据以确保一切看起来都很好......然后Java完全忘记它。这些类型并没有按照你希望的方式编译,它们已经消失了。

正因为如此,你的方法(我认为!)是最干净的,即使它感觉很笨拙。你需要实例化一个并使用反射来获得它的类型。