Java抽象使用instanceof从列表中收集类
假设我有以下层次结构的类:Java抽象使用instanceof从列表中收集类,java,Java,假设我有以下层次结构的类: public class MainClass { } class A extends MainClass { } class B extends MainClass { } class C extends MainClass { } 现在假设我有一个列表类,如下所示: {A, MainClass, A, B, B, MainClass, C, A, C, B, A} public <T extends MainClass> List&l
public class MainClass {
}
class A extends MainClass {
}
class B extends MainClass {
}
class C extends MainClass {
}
现在假设我有一个列表类
,如下所示:
{A, MainClass, A, B, B, MainClass, C, A, C, B, A}
public <T extends MainClass> List<T> getClasses(List<MainClass> classes, Class classToCollect) {
List<T> subclasses = new ArrayList<T>();
for (MainClass clazz : classes) {
if (clazz.getClass().isInstance(classToCollect)) {
subclasses.add((T)clazz);
}
}
return subclasses;
}
我希望能够根据对象的类来选择对象的子列表。例如,我希望能够仅提取类A列表中的那些类(而不是类MainClass)。因此,使用isAssignableFrom(A.class)对我来说不起作用
我当前的方法如下所示:
{A, MainClass, A, B, B, MainClass, C, A, C, B, A}
public <T extends MainClass> List<T> getClasses(List<MainClass> classes, Class classToCollect) {
List<T> subclasses = new ArrayList<T>();
for (MainClass clazz : classes) {
if (clazz.getClass().isInstance(classToCollect)) {
subclasses.add((T)clazz);
}
}
return subclasses;
}
public List getClasses(List Class,Class classToCollect){
列表子类=新的ArrayList();
对于(主课堂:课堂){
if(clazz.getClass().isInstance(classToCollect)){
子类。添加((T)clazz);
}
}
返回子类;
}
这仍然不起作用,并传回一个空列表。这里给出了什么?条件应如下所示:
for (MainClass obj : classes) {
if (classToCollect.isInstance(obj)) {
subclasses.add((T)obj);
}
}
名称clazz
具有误导性,因为它实际上是一个对象
通过在方法标题中使用Class
,可以进一步提高代码的类型安全性:
public <T extends MainClass> List<T> getClasses(List<MainClass> classes, Class<T> classToCollect) {
...
}
public List getClasses(List Class,Class classToCollect){
...
}
注意:如果将
MainClass.class
作为第二个参数传递,这将不起作用(感谢JB Nizet
,感谢您的宝贵意见)。使用Java 8,您可以这样表达:
public <T> List<T> getClasses(List<? super T> instances, Class<T> classToCollect) {
return instances.stream()
.filter(c -> c.getClass() == classToCollect)
.map(c -> (T) c)
.collect(Collectors.toList());
}
public List getClasses(List为什么不看看类对象是否相等?这同样适用于clazz.getClass().getName().equals(A.class.getName())
和clazz.getClass().equals(A.class)
List类型的参数应命名为类似“objects”的名称。它不是类es的列表,而是对象的列表。类似地,for循环变量应命名为类似对象的名称,同样,它将保存对象而不是类。术语class而不是instance/object的用法更像是OP方面的误解.Oops,clazz
是我的错。class
最初是被使用的,所以在有人抱怨语法不好之前我就修改了它。我应该修改它吗?我想知道java 8的等价物是什么,因为人们会希望做一个简单的.OfType()
,就像你在现代语言中看到的那样…@HighCoreclasses.stream().filter(A.class::isInstance)
不确定这是否是OP的问题,但如果他还希望通过传递MainClass.class来获得不是A、B或C实例的MainClass实例,那将不起作用。在这种情况下,他必须检查这些类是否相等。