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

How to downcast an array in Java?

我目前有一个 Tile class 扩展了 Node class,我想像这样将一个节点数组向下转换为一个 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 是一个子class,这应该是从 Nodes 到 Tiles 的安全转换。

如果 TileNode 的子 class,则所有 Tile 都是 Node,但 不是 所有 NodeTile

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

例如,以下将抛出 ClassCastException

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

另一方面,以下将起作用:

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

您可以使用集合,例如:

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());
}