我目前有一个类似的列表:
List<Parent> parentList = new Arraylist<>;
//Code inserts elements of subclassA and subclass B into parentList above
现在我想从parentList中提取类型为子类A的元素。我想做以下但没有错误:
List<SubclassA> extractMe = new Arraylist<>;
for (Parent parent: parentList){
if (parent.isSubclassA()){extractMe.add(parent);}
}
我不知道如何做到这一点。我不断收到错误,我在列表中添加了错误的对象类型/类,我理解为什么但我不知道如何更改代码以使其工作。
编辑:
错误(我已将这些类重命名为与上面使用的类匹配):
Error:(53, 20) java: no suitable method found for add(Parents.Parent)
method java.util.Collection.add(Parents.SubclassA) is not applicable
(argument mismatch; Parents.Parent cannot be converted to Parents.SubclassA)
method java.util.List.add(Parents.SubclassA) is not applicable
(argument mismatch; Parents.Parent cannot be converted to Parents.SubclassA)
答案 0 :(得分:5)
java中有一个名为instanceof
的关键字,它将实例化对象与类定义进行比较,以查看该对象是否属于该特定类类型。
在您的示例中,您可以在循环中使用instanceof关键字,然后将父对象强制转换为子类并将其添加到列表中。
for(Parent parent : parentList)
{
if(parent instanceof SubclassA)
{
SubclassA subclass = (SubclassA)parent;
extractMe.add(subclass);
}
}
需要将子类转换为子类(SubclassA)parent
,因为即使您已经检查过parent
类型为SubclassA
的编译器仍然不知道因此你必须明确告诉编译器将parent
对象强制转换为SubclassA
。
另请注意,instanceof
关键字是java中的内置二进制运算符,它将根据您之后指定的类检查父级。如果您可以将parent instanceof SubclassA
投放到parent
,则SubclassA
仅才会成立。请参阅Oracle Docs Example:
类型比较运算符instanceof
instanceof运算符将对象与指定类型进行比较。您 可以使用它来测试对象是否是类的实例,实例 子类的实现,或实现特定的类的实例 接口
以下程序InstanceofDemo定义了一个父类(名为 Parent),一个简单的接口(名为MyInterface)和一个子类 (名为Child)继承自父级并实现 接口
class InstanceofDemo { public static void main(String[] args) { Parent obj1 = new Parent(); Parent obj2 = new Child(); System.out.println("obj1 instanceof Parent: " + (obj1 instanceof Parent)); System.out.println("obj1 instanceof Child: " + (obj1 instanceof Child)); System.out.println("obj1 instanceof MyInterface: " + (obj1 instanceof MyInterface)); System.out.println("obj2 instanceof Parent: " + (obj2 instanceof Parent)); System.out.println("obj2 instanceof Child: " + (obj2 instanceof Child)); System.out.println("obj2 instanceof MyInterface: " + (obj2 instanceof MyInterface)); } } class Parent {} class Child extends Parent implements MyInterface {} interface MyInterface {}
输出:
obj1 instanceof Parent: true obj1 instanceof Child: false obj1 instanceof MyInterface: false obj2 instanceof Parent: true obj2 instanceof Child: true obj2 instanceof MyInterface: true
使用instanceof运算符时,请记住null不是 任何事情的实例。