【问题标题】:Creating ArrayList of a Class defined in a variable创建在变量中定义的类的 ArrayList
【发布时间】:2018-11-01 20:04:32
【问题描述】:

假设我有这样的东西

Class klazz = Integer.class;

我有兴趣做这样的事情

List<(klazz Class)> something = new ArrayList<>();

something.add(new Integer(..))
something.add(new Integer(..))
.. etc

我可能需要使用反射,但是我不确定如何应用它。

可以不进行反思吗?如果不是,您认为它如何适合实施?

提前致谢

【问题讨论】:

  • 类型参数仅在编译时为您提供帮助。在运行时,它们会消失。因此,在运行时根据klazz 的不同值设置类型参数并不真正适合泛型的工作方式。我建议只使用List&lt;Object&gt; 并有一些逻辑来确保只有klazz 类型的对象才能进入它。
  • 请尽可能将其添加为响应。稍后我会检查它,如果还没有任何有用的东西,我会分配 at 作为响应
  • 如果klazzString.class,你期望会发生什么?
  • 我希望 List
  • List&lt;Class&gt; 应该只添加 Class 元素,new Integer(..) 不适合。

标签: java list generics arraylist


【解决方案1】:

我不能完全理解这个要求,但这可能会有所帮助:

public class Main {
    public static void main(String[] args) {
        ContainerWrapper<Integer> containerWrapper = new ContainerWrapper<>(Integer.class);
        containerWrapper.add(1);
        System.out.println(containerWrapper.containerType());
        System.out.println(containerWrapper.isInteger());
    }
}

class ContainerWrapper<T> {
    // Store type information here
    private Class<T> clazz;
    private List<T> list = new ArrayList<>();

    public ContainerWrapper(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void add(T element) {
        list.add(element);
    }

    public Class<T> containerType() {
        return clazz;
    }

    public boolean isInteger() {
        return clazz.isAssignableFrom(Integer.class);
    }
}

您可以使用clazz.isAssignableFrom(*.class)检查T类型

输出:

class java.lang.Integer
true

【讨论】:

  • 你在这里硬编码了整数:ContainerWrapper&lt;Integer&gt;,有什么方法可以通过类变量动态设置吗?如果不是,那么我将不得不坚持不使用泛型,但这不是好的做法。
  • 只喜欢ContainerWrapper&lt;Object&gt;,正如第一条评论中提出的那样。
  • List&lt;T&gt;没什么不同。
猜你喜欢
  • 2022-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-27
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多