Java 将类作为参数传递给方法,该方法返回该类的对象的数组列表

Java 将类作为参数传递给方法,该方法返回该类的对象的数组列表,java,generics,arraylist,Java,Generics,Arraylist,我创建了超类对象的ArrayList和ArrayList,并编写了此方法以返回其子类之一的ArrayList public static ArrayList<SubClass> getSubClass(ArrayList<SuperClass> superObjects){ ArrayList<SubClass> objects = new ArrayList<>(); for (SuperClass superObject : s

我创建了超类对象的ArrayList和ArrayList,并编写了此方法以返回其子类之一的ArrayList

public static ArrayList<SubClass> getSubClass(ArrayList<SuperClass> superObjects){
    ArrayList<SubClass> objects = new ArrayList<>();
    for (SuperClass superObject : superObjects) {
        if (superObject instanceof SubClass) {
            objects.add((SubClass) superObject);
        }
    }
    return objects;
}
公共静态ArrayList getSubClass(ArrayList超对象){
ArrayList对象=新的ArrayList();
for(超类超对象:超对象){
if(子类的超对象实例){
添加((子类)超对象);
}
}
归还物品;
}

现在我想调用一个类似的方法,从超类对象的同一ArrayList中提取不同子类的对象。有没有一种方法可以将这段代码推广为将类作为参数并返回该子类对象的ArrayList?

如果传入一个类,则可以执行此筛选,然后调用
Class.isInstance()
。这称为。这是一个带有流和
列表
界面的版本:

public <T> List<T> filterList(List<? super T> list, Class<T> subClass) {
    return list.stream().
            filter(o -> subClass.isInstance(o)).
            map(o -> (T) o).
            collect(Collectors.toList());
}
您可以这样测试它:

    List<Number> nums = new ArrayList<>();
    nums.add(1);
    nums.add(2);
    nums.add(3L);
    nums.add(4L);
    nums.add(5.0F);
    nums.add(6.0F);
    nums.add(7.0);
    nums.add(8.0);

    List<Integer> ints = filterList(nums, Integer.class);

    // prints [1, 2]
    System.out.println(Arrays.toString(ints.toArray()));
List nums=new ArrayList();
增加(1)项;
增加(2);
添加数量(3L);
添加数量(4L);
添加数值(5.0F);
添加数值(6.0F);
nums.add(7.0);
nums.add(8.0);
List ints=filterList(nums,Integer.class);
//印刷品[1,2]
System.out.println(Arrays.toString(ints.toArray());
运行时类型标记是泛型的常见习惯用法。例如,也使用它:

private static enum Foo {One, Two, Three}
Map<Foo, Integer> map = new EnumMap(Foo.class);
私有静态枚举Foo{1,2,3}
映射映射=新的枚举映射(Foo.class);
更新 根据来自的评论,这是一个简洁且警告性的基于自由流的过滤器:

public <T> ArrayList<T> filterList(List<? super T> list, Class<T> subClass) {
    return list.stream().
    return list.stream().
            filter(o -> subClass.isInstance(o)).
            map(o -> subClass.cast(o)). // warning-free casting
            collect(Collectors.toCollection(ArrayList::new)); // forcing an ArrayList collector
}

公共阵列列表过滤器列表(列表您可以传入子类型的类并使用它,但我觉得您可能没有正确地使用泛型。如果您需要一个
子类
的列表,那么创建一个并使用它。如果您需要一个仅取决于
超类
的行为的列表,那么就使用它。如果他想返回ArrayList而不是y List不需要“手动筛选”,您可以定义自己的收集器。事实上,
收集器。toList()
实际上是在后台返回ArrayList实例,这样您就可以简单地复制代码。因此,这只是对第一个解决方案的抛弃(不是双关语)不过,我不希望依赖这种未记录的行为。不,我并不是建议您必须在ArrayList中使用blinding…收集器.toList()实现可能会在将来发生更改,这将不再是真的。但是,您可以复制当前的收集器。toList()或者它对更通用的收集器方法的等效调用,而不将其强制转换为列表,因此将其保留为ArrayList…我的观点是,您不需要放弃使用streams来返回回答中所述的ArrayList。查看收集器代码,这可能与使用
Collectors.toCollection一样简单(ArrayList::new)
也可以是
.map(o->(T)o)
可以是
.map(subClass::cast)
,这样可以避免未选中的强制转换警告。
public <T> ArrayList<T> filterList(List<? super T> list, Class<T> subClass) {
    return list.stream().
    return list.stream().
            filter(o -> subClass.isInstance(o)).
            map(o -> subClass.cast(o)). // warning-free casting
            collect(Collectors.toCollection(ArrayList::new)); // forcing an ArrayList collector
}