Java 检查列表中某个子类的实例并返回该对象
我有两个对象A和B,其中B是A的延伸 我有一个可以包含As和Bs的列表 我有一个方法是这样的: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
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有效,谢谢。