繁体   English   中英

从父类列表中提取子类元素

[英]Extract subclass elements from List of parent class

我目前有一个像这样的清单:

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)

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 SubclassASubclassASubclassA parent instanceof SubclassA 为true。 请参阅Oracle Docs示例

类型比较运算符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不是任何实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM