Java中的ArrayList和多态

时间:2019-03-14 11:16:49

标签: java inheritance arraylist polymorphism

作为学校项目的一部分,我试图在Java中实现一种垄断风格的游戏,但遇到一个我无法解决或似乎无法解决我所遇到问题的问题。问题是我的代码中出现了classCastException,我想我明白了为什么要得到它(我本来试图将类型Property强制转换为下面的newPosition变量)但是现在我需要找到一种实现代码的方法,以便避免它。

问题是我有一个超类Square,它具有3个可能的子类PropertyGoFreeParking。我将板存储为ArrayList,但是我需要访问与Property对象有关的方法以计算租金等。如果从ArrayList中访问属性类型为{{ 1}}。

如果这没有太大意义,请提前道歉。

Square

2 个答案:

答案 0 :(得分:0)

如果您知道某个特定的Square 属性,请对其进行强制转换并将其分配给适当的类型。

Property newPosition = (Property)board.get(player.getPosition());

编辑:将来,您可能还需要考虑将特定类型Square附带的逻辑放入子类中。换句话说,类似square.process(player)的东西,其中Property,Go和FreeParking都以适当的逻辑实现了process(player)方法。这涉及到有关面向对象设计的更详细的概念,并且可能与您现在无关。

答案 1 :(得分:0)

我希望这段代码可以帮助您理解概念

public static void main(String[] args) {
        Square newPosition = new Property();
        if (newPosition instanceof Property) {
            System.out.println("newPosition cast as Property");
            Property newPositionAsProperty = ((Property) newPosition);
            int newRent = newPositionAsProperty.getRent();
            // or
            newRent = ((Property) newPosition).getRent();
        }
        // To understand better
        if (newPosition instanceof Square) {
            System.out.println("newPosition instanceof Square");
            ((Square)newPosition).getName();
        }
        if (Square.class.isAssignableFrom(Property.class)) {
            System.out.println("Square.class.isAssignableFrom(Property.class)");
            ((Square)newPosition).getName();
        }
        if (Property.class.isInstance(newPosition)) {
            System.out.println("Property.class.isInstance(newPosition)");
            ((Property)newPosition).getName();
        }
        if (Square.class.isInstance(newPosition)) {
            System.out.println("Square.class.isInstance(newPosition)");
            ((Square)newPosition).getName();
        }
    }

结果:

newPosition cast as Property
newPosition instanceof Square
Square.class.isAssignableFrom(Property.class)
Property.class.isInstance(newPosition)
Square.class.isInstance(newPosition)