简体   繁体   English

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

[英]Extract subclass elements from List of parent class

I currently have a list like so: 我目前有一个像这样的清单:

List<Parent> parentList = new Arraylist<>;
//Code inserts elements of subclassA and subclass B into parentList above

now I want to extract the elements from parentList who are of type subclass A. I want to do the following but without errors: 现在,我想从parentList中提取属于子类A的元素。我想执行以下操作,但没有错误:

List<SubclassA> extractMe = new Arraylist<>;
for (Parent parent: parentList){
    if (parent.isSubclassA()){extractMe.add(parent);}
}

I am not sure how I can do this. 我不确定该怎么做。 I keep getting errors that I am adding what could be the wrong object type/class to the list and I understand why but I don't know how to change the code to make it work. 我不断收到错误,因为我将可能是错误的对象类型/类添加到列表中,我理解为什么,但是我不知道如何更改代码以使其正常工作。

Edit: 编辑:

The error (I've renamed the classes to match the ones used above): 错误(我将类重命名为与上面使用的类匹配):

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)

There is a keyword in java called instanceof which compares an instantiated object against a class definition to see if that object is of that specific class type. Java中有一个名为instanceof的关键字,它将实例化的对象与类定义进行比较,以查看该对象是否属于特定的类类型。

In your example you can use the instanceof keyword in your loop, then cast the parent object to a subclass and add it to your list. 在您的示例中,可以在循环中使用instanceof关键字,然后将父对象强制转换为子类并将其添加到列表中。

for(Parent parent : parentList)
{
    if(parent instanceof SubclassA)
    {
        SubclassA subclass = (SubclassA)parent;
        extractMe.add(subclass);
    }
}

The casting of parent to subclass (SubclassA)parent is needed because even though you may have already checked that parent is of type SubclassA the compiler still does not know and as such you have to explicitly tell the compiler to cast the parent object to a SubclassA . 需要将父对象转换为子类(SubclassA)parent对象,因为即使可能已经检查了parent对象为SubclassA类型, 编译器仍然不知道 ,因此您必须明确告诉编译器将parent对象转换为SubclassA

In addition note that the instanceof keyword is a built in binary operator in java which will check parent against the class you specify afterwards. 另外请注意, instanceof关键字是java中的内置二进制运算符,它将根据您随后指定的类检查父级。 parent instanceof SubclassA will only be true if you can cast parent to SubclassA . 当您可以将parent SubclassASubclassASubclassA parent instanceof SubclassA 为true。 See the Oracle Docs Example : 请参阅Oracle Docs示例

The Type Comparison Operator instanceof 类型比较运算符instanceof

The instanceof operator compares an object to a specified type. instanceof运算符将对象与指定类型进行比较。 You can use it to test if an object is an instance of a class, an instance of a subclass, or an instance of a class that implements a particular interface. 您可以使用它来测试对象是实现特定接口的类的实例,子类的实例还是类的实例。

The following program, InstanceofDemo, defines a parent class (named Parent), a simple interface (named MyInterface), and a child class (named Child) that inherits from the parent and implements the interface. 以下程序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 {} 

Output: 输出:

 obj1 instanceof Parent: true obj1 instanceof Child: false obj1 instanceof MyInterface: false obj2 instanceof Parent: true obj2 instanceof Child: true obj2 instanceof MyInterface: true 

When using the instanceof operator, keep in mind that null is not an instance of anything. 使用instanceof运算符时,请记住,null不是任何实例。

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

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