我有一个父类Parent
,还有三个扩展它的类:ChildOne
,ChildTwo
和ChildThree
,每个类都会覆盖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
对象将保留一个子类对象,该子对象是其所谓的子类。
我该如何解决这个问题,并能够根据数组中每个对象的类进行类型转换?
非常感谢!
答案 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;
}