如何读取具有作为子类实例的对象的parcelable对象数组?

时间:2014-02-11 18:13:15

标签: java android arrays parcelable serializable

我有一个ParcelableBoard,其中包含ParcelableSquare类型的对象(超类)。该数组包含SnakeSquare类型(子类)和LadderSquare(另一个子类)的对象。

Square实施ParcelableSnakeSquareLadderSquare扩展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的实例。我该怎么做才能解决这个问题?

2 个答案:

答案 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实例,但您可以做反之亦然。