java 接口避免转换

java interface avoid casting

我有两个 class。实现 "Node" 的接口 class "Node" 和 "Nodegraph"。 "Node" 有一种参数方法,add,我使用 Node 节点作为参数。在 NodeGraph 中,我需要转换 (NodeGraph) 节点才能使用 NodeGraph 对象。有没有更好的方法来避免转换?

import java.util.Set;

public interface Node {
    public String getId();
    public void add(Node node);
    public boolean remove(Node node);
}


import java.util.Iterator;
import java.util.LinkedList;

public class NodeGraph implements Node {

    private int row;
    private int column;
    private String id;
    private LinkedList<NodeGraph> neighbourds = new LinkedList<NodeGraph>();

    public NodeGraph(int row, int column) {
        this.row = row;
        this.column = column;
        id = "" + row + column;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void add(Node node) {
        neighbourds.add((NodeGraph) node);
    }

    @Override
    public boolean remove(Node node) {
        return neighbourds.remove((NodeGraph) node);
    }

}

发生这种情况是因为您 neighbourds 列表是不变的,这意味着您只能插入参数化类型,在这种情况下为 NodeGraph,将列表定义为与 [=13= 协变的] 会让你添加 Node:

的任何子类
private LinkedList<? extends Node> neighbourds = new LinkedList<>();

您应该使用接口声明 neighbors 列表(对于 ListNode):

private List<Node> neighbourds = new LinkedList<>();

我假设您有正当理由将 neighbourds 列表绑定到 NodeGraph 类型。 如果是这样,您可以通过参数化 Node 接口来避免强制转换:

public interface Node< T extends Node<T> > {
    public String getId();
    public void add(T node);
    public boolean remove(T node);
}

public class NodeGraph implements Node<NodeGraph> {

    private int row;
    private int column;
    private String id;
    private LinkedList<NodeGraph> neighbourds = new LinkedList<NodeGraph>();

    public NodeGraph(int row, int column) {
        this.row = row;
        this.column = column;
        id = "" + row + column;
    }

    @Override
    public String getId() {
        return id;
    }

    @Override
    public void add(NodeGraph node) {
        neighbourds.add(node);
    }

    @Override
    public boolean remove(NodeGraph node) {
        return neighbourds.remove(node);
    }
}