返回一个类的新集

时间:2015-04-02 18:32:35

标签: java hashset

我最近遇到了Java问题。我有一个HashSet hashSet和一个超类' Foo'。此集充满了foobardop的子类。如何仅使用类bardop的值返回填充值的新HashSet?

我尝试了以下内容:

public Set<Foo> getObjectsFromClass(Foo foo) {
    Set<Foo> objectsFromClass = new HashSet<>();
        for (Foo value: hashSet) {
            if ((value instanceof Bar) && (foo instanceof Bar))
                objectsFromClass.add(value);
            if ((value instanceof Dop) && (foo instanceof Dop))
                objectsFromClass.add(value);
        }
    }
    return objectsFromClass;
}

但问题是我必须放弃一个对象的参数,而我只想指定类。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

听起来你想要传入类(而不是类的实例)并使用Class.isInstance

public Set<Foo> getObjectsFromClass(Class<? extends Foo> clazz) {
    Set<Foo> objectsFromClass = new HashSet<>();
    for (Foo value: hashSet) {
        if (clazz.isInstance(value)) {
            objectsFromClass.add(value);
        }
    }
    return objectsFromClass;
}

然后用:

调用它
Set<Foo> x = getObjectsFromClass(Dop.class);

作为奖励,对参数的约束意味着如果你尝试做一些愚蠢的事情,它将无法编译:

Set<Foo> x = getObjectsFromClass(String.class); // Error

如果您需要更改返回类型以反映子类型,您可以使方法通用:

static <T extends Foo> Set<T> getObjectsFromClass(Class<T> clazz) {
    Set<T> objectsFromClass = new HashSet<>();
    for (Foo value: hashSet) {
        if (clazz.isInstance(value)) {
            objectsFromClass.add(clazz.cast(value));
        }
    }
    return objectsFromClass;
}

然后你可以使用:

Set<Dop> dops = getObjectsFromClass(Dop.class);