假设我有一个超类型(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类型的集合,所以我可以在其中包含两种类型的子类型。但是当涉及到一点处理时,我需要知道这两个子类中的哪一个,所以我可以将它传递给一个将子类型作为参数的方法。我可以轻松地使用超类型作为参数,但这不安全,因为我处理特定于子类型的数据。
答案 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)
来切换案例。然后你可以转换类型并调用你需要的方法。无需将形状对象保存在不同的集合中