从父类的List中提取子类元素

时间:2015-02-12 22:45:11

标签: java inheritance

我目前有一个类似的列表:

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)

1 个答案:

答案 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不是   任何事情的实例。