作为学校项目的一部分,我试图在Java中实现一种垄断风格的游戏,但遇到一个我无法解决或似乎无法解决我所遇到问题的问题。问题是我的代码中出现了classCastException,我想我明白了为什么要得到它(我本来试图将类型Property
强制转换为下面的newPosition
变量)但是现在我需要找到一种实现代码的方法,以便避免它。
问题是我有一个超类Square
,它具有3个可能的子类Property
,Go
和FreeParking
。我将板存储为ArrayList,但是我需要访问与Property
对象有关的方法以计算租金等。如果从ArrayList中访问属性类型为{{ 1}}。
如果这没有太大意义,请提前道歉。
Square
答案 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)