获取泛型类型的数组类

4

我有一个带有泛型的类。 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[]的新实例并读取其类来解决了这个问题。我想知道是否有更好的方法或者这种方法有什么缺点。
更新: 我的目标是:我有一个通用的DataProvider,它从服务器请求JSON数据。我使用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<T> list; 并实例化它呢?不需要任何魔法。 :-) - Buurman
@SotiriosDelimanolis 我非常确定它可以工作。我没有编写它,所以不允许分享。 - Dominic
@Buurman 我更新了问题,解释了我正在做什么。希望这能澄清一些事情。 - Dominic
@SotiriosDelimanolis 正确。就是这样运作的。你说得对,我应该把我的第一个例子抽象化。我忘了这一点,因为我试图让它尽可能简单。结果证明它太简单了 ;) - Dominic
2
https://dev59.com/o2Yr5IYBdhLWcg3wytHe - Sotirios Delimanolis
1个回答

2
你应该查看类型擦除,这可能会阻止你想要的清晰方式。 (泛型在这里无法帮助你。)
问题在于,在Java中,泛型类型数据在编译时用于确保一切看起来很好...然后Java完全忘记了它。类型并没有以你希望的方式被编译进去,它们只是消失了。
因此,尽管感觉有点像黑客行为,但你的方法(我认为!)是最干净的。你需要实例化一个对象并使用反射来获取其类型。

谢谢,我现在对泛型有了更好的理解。我不知道它们会编译成对象,这就是为什么https://dev59.com/o2Yr5IYBdhLWcg3wytHe 中的一些解决方案不起作用的原因。所以我会坚持我的解决方案。 - Dominic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接