如何在Java中向下转换数组?

时间:2018-05-27 10:52:50

标签: java inheritance downcast

我目前有一个扩展Tile类的Node类,并希望将一组节点向下转换为Tiles数组,如下所示:

class Node<T> {
  Node[] neighbours;
  private final T value;
}

class Tile extends Node {

  public Tile(Point value) {
    super(value);
  }

  Tile[] neighbours = (Tile[]) this.getNeighbours;
}

目前,编译器抛出了ClassCastException并且我不知道如何修复它。

我不是100%熟悉继承,但我认为,因为Tile是一个子类,所以应该是从Nodes到Tiles的安全转换。

2 个答案:

答案 0 :(得分:2)

如果TileNode的子类,则所有Tile sa Node,但所有Node sa Tile s。

因此,将Node[]转换为Tile[]是错误的,因为所有Node数组都是Tile数组。

例如,以下内容将抛出ClassCastException

Node[] nodes = new Node[10];
Tile[] tiles = (Tile[]) nodes;

另一方面,以下内容可行:

Node[] nodes = new Tile[10];
Tile[] tiles = (Tile[]) nodes;

答案 1 :(得分:0)

您可以使用集合,例如:

class Node<T> {
    List<Node> neighbours;
    private T value;
}

class Tile extends Node {

    public Tile(String value) {
        super(value);
    }

    List<Tile> neighbours = this.neighbours.stream().filter(item -> item instanceof Tile).map(item -> (Tile) item).collect(Collectors.toList());
}