我有一个Parcelable
类Board
,其中包含Parcelable
个Square
类型的对象(超类)。该数组包含SnakeSquare
类型(子类)和LadderSquare
(另一个子类)的对象。
Square
实施Parcelable
。
SnakeSquare
和LadderSquare
扩展Square,并覆盖writeToParcel
并拥有带Parcel in
参数的自己的构造函数。
我的问题是,当我尝试读取Square对象数组时,它不会将任何对象转换为SnakeSquares和LadderSquares。这是我到目前为止所尝试的:
public Board(Parcel in) {
board = new Square[100];
Object[] temp = in.readArray(Square.class.getClassLoader());
for(int i = 0; i < board.length; i++) {
if(temp[i] instanceof SnakeSquare)
board[i] = (SnakeSquare) temp[i];
else if(temp[i] instanceof LadderSquare)
board[i] = (LadderSquare) temp[i];
else
board[i] = (Square) temp[i];
}
}
但是,它不起作用,因为temp中的元素都不是SnakeSquare或LadderSquare的实例。我该怎么做才能解决这个问题?
答案 0 :(得分:0)
只要SnakeSquare和LadderSquare都继承自Square,您就应该能够将它们存储在同一个数组中。您是否尝试将它们添加到ArrayList?我知道在使用java的ArrayList数据结构时我确实做过类似的事情。 以下是我所做过的类似事情的例子。在下面的代码中,BiasNode继承自InputNode,我可以将它们存储在同一个列表中。我运行测试以确保一切按预期工作,并且确实如此。当我检查列表时,我看到一个包含BiasNodes和输入节点的列表。
尝试使用ArrayList,看看会发生什么。
protected ArrayList<InputNode> nodeList = new ArrayList<InputNode>();
public void initializeNodes(int numberOfNodes, boolean addBiasNode)
{
BiasNode biasNode = new BiasNode(1.0);
if(addBiasNode)
{
nodeList.add(biasNode);
}
for(int i=0; i<numberOfNodes;i++)
{
InputNode newNode = new InputNode();
nodeList.add(newNode);
}
}
答案 1 :(得分:-1)
我认为你必须在这里改变
Object[] temp = in.readArray(Square.class.getClassLoader());
Square.class.getClassLoader()
您在这里使用基类,您无法将baseClass
实例强制转换为childClass
实例,但您可以做反之亦然。