从超类型转回给孩子

时间:2012-04-10 20:08:55

标签: java casting

假设我有一个超类型(Shape)和两个孩子(如Square,Circle)。

我正在尝试做这样的事情:

Shape shape = someObject.getShape();

if (shape instanceof Square){
    shape = (Square) shape;
    // do this
} else if (shape instanceof Circle) {
    shape = (Circle) shape;
    // do that
}

此外,由于获取实例似乎不是正确的OO原则,还有另一种方法吗?欢呼声。

编辑。我不是要尝试调用它们的方法,我想将它们传递给需要特定子类型的一些方法。

edit2 基本上我有一个Shape类型的集合,所以我可以在其中包含两种类型的子类型。但是当涉及到一点处理时,我需要知道这两个子类中的哪一个,所以我可以将它传递给一个将子类型作为参数的方法。我可以轻松地使用超类型作为参数,但这不安全,因为我处理特定于子类型的数据。

3 个答案:

答案 0 :(得分:6)

您需要正确声明变量,例如:

if (shape instanceof Square){
    Square square = (Square) shape;
    // do this with square
} else if (shape instanceof Circle) {
    Circle circle = (Circle) shape;
    // do that with circle
}

答案 1 :(得分:1)

在Java中声明引用后,您无法更改其类型。当你这样做时:

Shape shape = someObject.getShape();

您说的是:“存储对变量形状中的Shape的引用”。由于你无法改变它的类型,所以没有意义

shape = (Square) shape;

因为你说形状(左侧)是一个形状,无论在作业的右侧是什么。

请记住:一旦您为参考声明了类型,就无法更改它。

答案 2 :(得分:1)

我真的不明白你要在这里完成什么,但当然你可以用

的形式来区分不同的情况
shape.getClass().isAssignableFrom(Square.class) ? processSquare((Square)shape) : processCircle((Circle)shape)

如果您首先检查实际的课程,那么该演员表将没有问题。

编辑您的形状类类型不会更改:

Shape[] shapes = new Shape[]{new Circle()}

当您循环浏览形状集合时,当您致电shapes[0].getClass()时,您将获得Circle.class类型。因此,在迭代形状集合并需要决定调用哪种类型特定集合时,可以调用shape.getClass().isAssignableFrom(Circle.class)来切换案例。然后你可以转换类型并调用你需要的方法。无需将形状对象保存在不同的集合中