如何使用Class对象声明指定类型的ArrayList

The*_*K93 2 java class arraylist

我想将一个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();
}
Run Code Online (Sandbox Code Playgroud)

Ant*_*ala 5

您可以对Classto 进行泛化Class<T>,然后使用T:

public static <T> void createList(Class<T> cls) {
    ArrayList<T> = new ArrayList<>();
}
Run Code Online (Sandbox Code Playgroud)

要展开,如果需要从列表中查找类的所有实例或其子类,并将结果值作为列表返回,则可以执行以下操作:

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;
}
Run Code Online (Sandbox Code Playgroud)

有人建议不能这样做,做起来没有意义,但确实有很多意义.

还有人建议original参数使用有界类型List<? super T>.再次,这将是无用的,它不会增加类型安全性,但实际上使方法本身不那么有用.

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

List<SomeClass> lst;
...
filterInstancesOf(lst, Serializable.class);
Run Code Online (Sandbox Code Playgroud)

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