动态类型转换为子类

时间:2015-02-24 16:56:11

标签: java casting polymorphism

我有一个父类Parent,还有三个扩展它的类:ChildOneChildTwoChildThree,每个类都会覆盖Parent的方法类。我创建了一个Parent个对象数组,然后动态地(从用户输入)创建了一个子类的对象。在此之后,我需要遍历Parent[]数组,并希望将每个元素打印到其中" s" real" class(其中一个子类),以便使用适当的override方法 我尝试为子类的类型创建一个变量,如下所示:

    for (int i = 0; i < parents.length; i++) {
        try {
            Parent par = new Parent();
            par = parents[i];
            switch (par.getType()) {
                case "one":
                    ChildOne child1 = (ChildOne)par;
                    System.out.println(child1.overridenMethod());
                    break;
                case "two":
                    ChildTwo child2 = (ChildTwo)par;
                    System.out.println(child2.overridenMethod());
                    break;
                case "three":
                    ChildThree child3 = (ChildThree)par;
                    System.out.println(child3.overridenMethod());
                    break;
            }
        } catch (NullPointerException npe) {
            System.out.println("No child at position: " + i);
        }
    }  

但我收到错误消息称ChildThree无法转换为ChildTwo。看来,在第一个元素(成功进行类型转换)之后,par对象将保留一个子类对象,该子对象是其所谓的子类。 我该如何解决这个问题,并能够根据数组中每个对象的类进行类型转换?
非常感谢!

2 个答案:

答案 0 :(得分:1)

覆盖意味着您在父级和子级中有一个方法会覆盖其功能。

您可以直接在您的案例中使用多态。无需投射:

for (Parent par: parents) {
    try {
        System.out.println(par.overridenMethod());
    } catch (NullPointerException npe) {
        System.out.println("No child at position: " + i);
    }
}  

答案 1 :(得分:1)

如前所述,不需要强制转换,因为您在每个对象上调用的方法已在类Parent中定义。所以你可以简单地写一下:

for (int i = 0; i < parents.length; i++) {
    Parent par = parents[i];
    System.out.println(par.overridenMethod());
}

关于你的类型转换错误,我的猜测是你的getType方法有错误。它可能会为您的一个Child实现返回一个错误的值,并最终出现在错误的case块中。通常,在构建对象时应使用instanceof:

if(par instanceof ChildOne){
    ChildOne child1 = (ChildOne)par; 
}