Java 从父类列表中提取子类元素
我目前有这样一个列表:Java 从父类列表中提取子类元素,java,inheritance,Java,Inheritance,我目前有这样一个列表: List<Parent> parentList = new Arraylist<>; //Code inserts elements of subclassA and subclass B into parentList above java中有一个名为instanceof的关键字,它将实例化对象与类定义进行比较,以查看该对象是否属于特定的类类型 在您的示例中,您可以在循环中使用instanceof关键字,然后将父对象强制转换为子类并将其添加到列
List<Parent> parentList = new Arraylist<>;
//Code inserts elements of subclassA and subclass B into parentList above
java中有一个名为instanceof的关键字,它将实例化对象与类定义进行比较,以查看该对象是否属于特定的类类型 在您的示例中,您可以在循环中使用instanceof关键字,然后将父对象强制转换为子类并将其添加到列表中
for(Parent parent : parentList)
{
if(parent instanceof SubclassA)
{
SubclassA subclass = (SubclassA)parent;
extractMe.add(subclass);
}
}
需要将父对象强制转换为子类SubassaParent,因为即使您可能已经检查了父对象是否为Subassa类型,编译器仍然不知道,因此您必须显式地告诉编译器将父对象强制转换为子类
此外,请注意instanceof关键字是java中内置的二进制运算符,它将根据您随后指定的类检查父类。只有当您可以将父类强制转换为子类时,子类的父类实例才会为true。见:
类型比较运算符instanceof
instanceof运算符将对象与指定类型进行比较。你
可以使用它来测试一个对象是否是一个类的实例
子类的,或实现特定
接口
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 {}
下面的程序InstanceofDemo定义了一个名为
父类、名为MyInterface的简单接口和子类
从父级继承并实现
接口
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不是
任何事情的实例
java中有一个名为instanceof的关键字,它将实例化对象与类定义进行比较,以查看该对象是否属于特定的类类型 在您的示例中,您可以在循环中使用instanceof关键字,然后将父对象强制转换为子类并将其添加到列表中
for(Parent parent : parentList)
{
if(parent instanceof SubclassA)
{
SubclassA subclass = (SubclassA)parent;
extractMe.add(subclass);
}
}
需要将父对象强制转换为子类SubassaParent,因为即使您可能已经检查了父对象是否为Subassa类型,编译器仍然不知道,因此您必须显式地告诉编译器将父对象强制转换为子类
此外,请注意instanceof关键字是java中内置的二进制运算符,它将根据您随后指定的类检查父类。只有当您可以将父类强制转换为子类时,子类的父类实例才会为true。见:
类型比较运算符instanceof
instanceof运算符将对象与指定类型进行比较。你
可以使用它来测试一个对象是否是一个类的实例
子类的,或实现特定
接口
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 {}
下面的程序InstanceofDemo定义了一个名为
父类、名为MyInterface的简单接口和子类
从父级继承并实现
接口
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不是
任何事情的实例
请在此处粘贴错误。将添加部分强制转换为:extractMe.AddSubassessParent;等等,你想把父母变成孩子?父类将如何填补子类的空白?@ryanyyu:我试图获取包含ChildA或ChildB的父类列表,如果是ChildA,则将元素添加到新的子类列表中ChildA@yarivt:我不认为演员会自动知道如何自动转换,如果它是错误的类。这将阻止编译器给出错误,但如果我犯了错误并向其提供了错误的对象类,它实际上会防止将来出现错误吗?请将错误粘贴到此处。将添加部分强制转换为:extractMe.addSubassessParent;等等,你想把父母变成孩子?父类将如何填补子类的空白?@ryanyyu:我试图获取包含ChildA或ChildB的父类列表,如果是ChildA,则将元素添加到新的子类列表中ChildA@yarivt:我不认为演员会自动知道如何自动转换,如果它是错误的类。这将阻止编译器给出错误,但如果我犯了错误并将错误的对象类提供给它,它真的能防止将来出现错误吗?这会起到什么作用,还是简单地“欺骗”编译器,使其认为将执行强制转换?因为如果我犯了一个错误,给它子类B,我不认为它实际上可以将子类B的对象转换为子类…@jigglyizard instanceof关键字是java中内置的二进制运算符,它将根据您随后指定的类检查父类。只有当您可以将父类强制转换为子类时,子类的父类实例才会为true。看到了吗?我遇到过这个解决方案,但我认为应该不惜一切代价避免实例。我现在试过了,效果很好。我将坚持这一点。谢谢。@jigglyzard instanceof和java中的任何其他关键字一样。它有它的名字
它的正确用途和用途。在那个例子中,他们链接了大量的instanceof来检查多个继承级别。这可能很麻烦。但是,单继承检查很好。这会起到什么作用,还是简单地“欺骗”编译器,使其认为将执行强制转换?因为如果我犯了一个错误,给它子类B,我不认为它实际上可以将子类B的对象转换为子类…@jigglyizard instanceof关键字是java中内置的二进制运算符,它将根据您随后指定的类检查父类。只有当您可以将父类强制转换为子类时,子类的父类实例才会为true。看到了吗?我遇到过这个解决方案,但我认为应该不惜一切代价避免实例。我现在试过了,效果很好。我将坚持这一点。谢谢。@jigglyzard instanceof和java中的任何其他关键字一样。它有它的适当用途和用途。在那个例子中,他们链接了大量的instanceof来检查多个继承级别。这可能很麻烦。但是,单继承检查很好。