return 新一套 class

return new set for one class

我 运行 最近遇到了 Java 的问题。我有一个 HashSet hashSet 和一个 superclass 'Foo'。此集合充满了 foo 的子class:bardop。我如何 return 一个新的 HashSet 只填充 class bardop 的值?

我尝试了以下方法:

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;
}

但问题是我不得不放弃与对象的争论,而我只想指定 class。我该如何解决?

听起来您想传入 class(而不是 class 的实例)并使用 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

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

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);