从Java中的另一个类“导入”泛型类型

时间:2015-04-19 23:08:41

标签: java generics

我正在尝试使用节点和边缘来表示图形。

我有一个类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到它。

3 个答案:

答案 0 :(得分:2)

我会将edgesValues方法放入一个由NodeTypeEdgeType进行参数化的单独类中:

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>作为参数并没有多大意义 - 认为你在那里遇到了设计缺陷,也许你应该使用另一种设计模式