2

假设我有一个超级类型(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 类型的集合,所以我可以在其中保存两种类型的子类型。但是当涉及到处理时,我需要知道这两个子类中的哪一个,所以我可以将它传递给一个将子类型作为参数的方法。我可以轻松地使用超类型作为参数,但这并不安全,因为我处理的是特定于子类型的数据。

4

3 回答 3

7

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

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
}
于 2012-04-10T20:10:50.033 回答
1

一旦你在 Java 中声明了一个引用,你就不能改变他的类型。当你这样做时:

Shape shape = someObject.getShape();

你是说:“在变量形状中存储对形状的引用”。由于您无法更改其类型,因此没有任何意义

shape = (Square) shape;

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

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

于 2012-04-10T20:23:34.243 回答
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)例如切换案例。然后你可以转换类型并调用你需要的方法。无需将形状对象保存在不同的集合中

于 2012-04-11T00:16:27.320 回答