我最近遇到了Java问题。我有一个HashSet hashSet
和一个超类' Foo'。此集充满了foo
:bar
和dop
的子类。如何仅使用类bar
或dop
的值返回填充值的新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;
}
但问题是我必须放弃一个对象的参数,而我只想指定类。我该如何解决这个问题?
答案 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);