我正在尝试使用节点和边缘来表示图形。
我有一个类Node,必须是:
public class Node<NodeType>
和另一个类Edge,我可以以任何方式进行参数化。起初我以为Edge<EdgeType>
,但由于他们将节点作为属性,我最终做了以下操作(主要是因为Eclipse告诉我如果我没有参数化它就将Node作为原始类型)
public class Edge<EdgeType, NodeType> {
private Node<NodeType> start;
private Node<NodeType> end;
private EdgeType value;
...
}
这使我能够在Edge类中无问题地工作,但Node类中有一些方法需要使用Edges,例如
public List<EdgeType> edgesValues(Node<NodeType> node) {
/*Returns a list of values of the edges between the node it is called on and the node given by argument*/
}
我无法使用,因为没有定义EdgeType。由于我不能在Node类中添加另一个参数,我不知道如何&#34; import&#34; EdgeType到它。
答案 0 :(得分:2)
我会将edgesValues
方法放入一个由NodeType
和EdgeType
进行参数化的单独类中:
class Node<N> {
N value;
}
class Edge<E, N> {
Node<N> from;
Node<N> to;
E value;
}
class Graph<E, N> {
Node<N> newNode(N nodeVal) {
...
}
Edge<E, N> newEdge(E edgeVal, Node<N> from, Node<N> to) {
...
}
List<E> edgesValues(Node<N> node) {
...
}
}
答案 1 :(得分:0)
如果您“确定某个类必须是某个类”,那么您应该从EdgeType
中删除Edge
,但您还是没有使用它:
public class Edge<N> {
private Node<N> start;
private Node<N> end;
private int value;
}
在Node
课程中,您现在不需要任何其他类型参数:
public List<Edge<N>> edges(...) { ... }
无论如何,你可能不需要比int
更复杂的东西。
答案 2 :(得分:0)
您的解决方案非常简单,使用通用方法:
public <EdgeType> List<EdgeType> edgesValues(Node<NodeType> node) {
}
但是在Node<NodeType>
的实例中传递Node<NodeType>
作为参数并没有多大意义 - 认为你在那里遇到了设计缺陷,也许你应该使用另一种设计模式