[英]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
SubclassA
为SubclassA
, SubclassA
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.