Java 检查列表中某个子类的实例并返回该对象

Java 检查列表中某个子类的实例并返回该对象,java,list,if-statement,return,instanceof,Java,List,If Statement,Return,Instanceof,我有两个对象A和B,其中B是A的延伸 我有一个可以包含As和Bs的列表 我有一个方法是这样的: B findB() { for (int i = 0; i < ABlist.size(); i++) { if(ABlist.get(i) instanceof B) { return ABlist.get(i); } else{return null;} } ret

我有两个对象A和B,其中B是A的延伸

我有一个可以包含As和Bs的列表

我有一个方法是这样的:

B findB()
{
    for (int i = 0; i < ABlist.size(); i++)
    {
        if(ABlist.get(i) instanceof B)
        {
                return ABlist.get(i);
        }
        else{return null;}
    }
    return null;
}
它应该检查列表中的所有对象,如果它是B的实例,则返回该对象。但是我收到一个不兼容的类型错误,因为A无法转换为B

解决此问题的最佳方法是什么?

您可以向类及其子类添加一个方法,该方法为特定子类返回该值,为其他子类返回null,而不是执行instanceof。像这样:

class A {
  public A get() {
    return null;
  }
}
class B extends A {
  @Override
  public A get() {
    return this;
  }
}
...
B findB() {
    for (A a : ABlist) {
        if (a.get() != null) {
            return (B) a;
        }
    }
    return null;
}

这样做的目的是尽可能避免即时使用。此运算符是语言的一部分,但反射和instanceof的广泛使用会使应用程序运行缓慢且无法维护。

您需要强制转换geti的结果。你不应该有其他的。您还应该使用迭代器而不是索引。另外,不要在else中返回null,只需完全删除else。根据@SotiriosDelimanolis的建议,如果B恰好是列表中的第一个实例,则此代码只会返回非空的B实例。@SotiriosDelimanolis有效,谢谢。