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
列表(对于 List
和 Node
):
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);
}
}
我有两个 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
列表(对于 List
和 Node
):
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);
}
}