return 新一套 class
return new set for one class
我 运行 最近遇到了 Java 的问题。我有一个 HashSet hashSet
和一个 superclass 'Foo'。此集合充满了 foo
的子class:bar
和 dop
。我如何 return 一个新的 HashSet 只填充 class bar
或 dop
的值?
我尝试了以下方法:
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);
我 运行 最近遇到了 Java 的问题。我有一个 HashSet hashSet
和一个 superclass 'Foo'。此集合充满了 foo
的子class:bar
和 dop
。我如何 return 一个新的 HashSet 只填充 class bar
或 dop
的值?
我尝试了以下方法:
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);