【问题标题】:How to declare an ArrayList of specified type using Class object如何使用 Class 对象声明指定类型的 ArrayList
【发布时间】:2015-05-17 01:33:30
【问题描述】:

我想将一个 Class 对象传递给一个函数,然后声明一个该类类型的 ArrayList。我想知道我是怎么做到的。

public static void CreateList(Class c){
    // I want to create this array list using the variable c to define its type
    ArrayList<c> list = new ArrayList();
}

【问题讨论】:

  • 你不能,而且这样做没有任何意义。
  • 不是在那个例子中,但是如果我有一些超类的列表,我想在其中找到子类的实例。公共静态 ArrayList extends Object> Get Objects(ArrayList extends Object> list, Class c) 不要一直做派对垃圾 Sotirios
  • 为什么不使用泛型方法定义? public static &lt;T&gt; void createList(T c)
  • 请在您的问题中发布您的实际用例。您当前问题的答案是:您不能。
  • 很公平,不要再告诉所有人他们不合逻辑。

标签: java class arraylist


【解决方案1】:

您可以将Class 泛化为Class&lt;T&gt;,然后使用T

public static <T> void createList(Class<T> cls) {
    ArrayList<T> = new ArrayList<>();
}

要展开,如果您需要从列表中找到一个类或其子类的所有实例并将结果值作为列表返回,您可以这样做:

public static <T> List<T> filterInstancesOf(List<?> original, Class<T> cls) {
    List<T> rv = new ArrayList<>();
    for (Object o: original) {
        if (cls.isInstance(o)) {
            rv.add(cls.cast(o));
        }
    }
    return rv;
}

有人建议这不能做,做也没有意义,但确实很有道理。

还建议original 参数使用有界类型,例如List&lt;? super T&gt;。同样,这将是无用的,它不会增加类型安全性,但实际上会使方法本身变得不那么有用。

就像现在一样,您可以使用该方法来过滤实现接口的实例,例如,假设我们有

List<SomeClass> lst;
...
filterInstancesOf(lst, Serializable.class);

如果方法使用有界类型,则不能使用,因为SomeClass 不是Serializable 的超类。

【讨论】:

  • 你甚至不需要传递类对象,因为它本身并不使用。
  • 它提供了类型。
  • 您可以使用有界类型参数来确保cls 实际上是列表元素类型的子类型。
  • 是的,但也不需要;现在 cls 也可以是一个接口。
  • 你是对的,因为你所拥有的更灵活,因为它允许一个接口。但是 OP 的评论询问了一个子类。有界类型参数(注意,不是有界通配符)可以在编译时强制限制子类,如果这确实是 OP 想要的。
【解决方案2】:

使用

Array.newInstance(Class<?> componentType, int length)

然后从中创建一个列表:

Arrays.asList(array)

【讨论】:

  • 这不是ArrayList
  • @SafeVarargs @SuppressWarnings("varargs") public static &lt;T&gt; List&lt;T&gt; asList(T... a) { return new ArrayList&lt;&gt;(a); }
  • Arrays.asList 创建的ArrayListArrays 的嵌套类。也就是说,它是java.util.Arrays$ArrayList 而不是java.util.ArrayList。它们的不同之处在于Arrays.asList 返回的列表不允许插入或删除元素。 (是的,这真的很混乱。)
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 2015-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-12
  • 1970-01-01
  • 2012-02-09
相关资源
最近更新 更多