【问题标题】:Get array class of generic type获取泛型类型的数组类
【发布时间】:2015-06-25 13:30:01
【问题描述】:

我有一个泛型类型的类。 导入 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 是字符串,那么

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)
        ...
    }
}

【问题讨论】:

  • 你想做什么?为什么要尝试获取数组类型的参数类型?如果您想在某处保留 T 类型元素的集合,为什么不创建一个字段 List&lt;T&gt; list; 并实例化它呢?不需要魔法。 :-)
  • @SotiriosDelimanolis 我很确定它有效。不是我写的,所以不能分享。
  • @Buurman 我更新了问题以解释我在做什么。希望它能澄清一点。
  • @SotiriosDelimanolis 正确。这就是它的工作原理。你说得对,我应该把我的第一个例子抽象化。我忘记了这一点,因为我试图让它尽可能简单。原来它太简单了;)

标签: java arrays generics


【解决方案1】:

您应该查找Type Erasure,这可能会妨碍您以干净的方式完成您所要求的工作。 (泛型在这里帮不了你。)

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

因此,您的方法是(我认为!)最干净的,即使它感觉很老套。您需要实例化一个并使用反射来获取它的类型。

【讨论】:

  • 谢谢,我现在对泛型有了更好的理解。我不知道它们会被编译为 Object。这就是为什么stackoverflow.com/questions/13392160/… 中的一些解决方案不起作用的原因。所以我会坚持我的解决方案。
猜你喜欢
  • 2019-01-20
  • 2011-10-25
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
相关资源
最近更新 更多