簡體   English   中英

從Java中的另一個類“導入”泛型類型

[英]“Importing” generic type from another class in Java

我試圖用節點和邊表示圖。

我有一個類Node必須是:

public class Node<NodeType>

還有另一個Edge類,我可以用任何方式對其進行參數化。 起初我以為Edge<EdgeType> ,但是由於它們將Nodes作為屬性,所以我最終做了以下事情(主要是因為Eclipse告訴我,如果不對Node進行原始設置,則Node是原始類型)

public class Edge<EdgeType, NodeType> {
    private Node<NodeType> start;
    private Node<NodeType> end;
    private EdgeType value;
    ...
}

這使我能夠在Edge類中正常工作,但是Node類中有一些方法需要使用Edge,例如

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類中添加另一個參數,因此我不知道如何將EdgeType“導入”到該類中。

我會將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) {
        ...
    }
}

如果您“固定了必須具有的類Node”,則應該從Edge刪除EdgeType ,無論如何都不要使用它:

 public class Edge<N> {
    private Node<N> start; 
    private Node<N> end;
    private int value;
 }

在您的Node類中,現在不需要任何其他類型參數:

 public List<Edge<N>> edges(...) { ... }

無論如何,您可能不需要比int更復雜的東西。

您的解決方案非常簡單,請使用通用方法:

public <EdgeType> List<EdgeType> edgesValues(Node<NodeType> node) {

}

但經過一個Node<NodeType>作為參數的實例中的Node<NodeType>犯規多大意義-記錯你擁有屬於自己的設計缺陷在那里,也許你應該用另一種設計模式

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM