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来检查多个继承级别。这可能很麻烦。但是,单继承检查很好。