从arraylist中提取子类的所有实例

时间:2015-05-12 11:26:19

标签: java generics arraylist

我有ArrayList<Unit> units。我想编写一个函数,它将返回指定子类的所有对象,用作参数。但是,我无法让它发挥作用。这就是我所拥有的:

public static ArrayList<? extends Unit> getTheseUnits(Class<? extends Unit> specific_unit) {
    ArrayList<specific_unit> res = new ArrayList<>();  //'specific_unit' is in red here. Adding '.class' or '.getClass()' after it does not resolve anything
    for (Unit u : units){
        if (u instanceof specific_unit){
            res.add(u);
        }
    }
    return res;
}

5 个答案:

答案 0 :(得分:4)

您无法在变量上使用instanceof。相反,您应该使用isInstance

只需更换此行:

if (u instanceof specific_unit) {

if (specific_unit.isInstance(u)){

答案 1 :(得分:4)

按类过滤:

QQQ

如果要将此方法设置为参数化,请使用其他选项:

public static List<Unit> getUnitsByClass(Class<? extends Unit> specificClass, List<? extends Unit> units) {
     return units.stream()
                 .filter(e -> e.getClass().equals(specificClass))
                 .collect(Collectors.toList());
}

但在第二种方法中,您将获得未经检查的投射警告。

答案 2 :(得分:2)

如果您更改方法签名,它可以起作用:

public static <T extends Unit> ArrayList<T> getTheseUnits(Class<T> specific_unit) {
    ArrayList<T> res = new ArrayList<>();
    for (Unit u : units){
        if (specific_unit.isAssignableFrom(u.getClass()) {
            res.add(u);
        }
    }
    return res;
}

只需使用特定类型的通用(<T>)而不是通配符(?)。这是创建返回类型(ArrayList<T>)所必需的。

此外,您应该使用isAssignableFrom()代替instanceof。请注意,isAssignableFrom()还会检查子类型。

请再次检查此代码,因为我没有测试过。

答案 3 :(得分:1)

试试这个:

public static <T extends Unit> ArrayList<T> getTheseUnits(Class<T> specific_unit) {
    ArrayList<T> res = new ArrayList<T>();
    for (Unit u : units){
        if (specific_unit.isInstance(u)){
            res.add((T) u);
        }
    }
    return res;
}

答案 4 :(得分:0)

也许你可以尝试不使用类而是在声明和返回中使用接口(所以List而不是ArrayList和Unit而不是SpecificUnit)。我已经重命名了类和实例java样式......例如:

public static List<? extends Unit> getTheseUnits(Class<? extends Unit> specificUnit, List<Unit> units) {
    List<Unit> res = new ArrayList<Unit>();
    for (Unit u : units){
        if (specificUnit.isInstance(u)){
            res.add(u);
        }
    }
    return res;
}

编译。可能它正是你要找的......让我知道它是否有用