2016-05-06 163 views
1

我遇到了Java抽象類和泛型函數的問題。該實現是Dijkstra算法圖中的一個節點類。Java抽象類通用方法參數

public abstract class Node { 

    float distance; 
    Node parent; 

    public void relax(Node parent, Edge edge, PriorityQueue<? extends Node> priorityQueue) { 
     if (this.distance > parent.distance + edge.weight){ 
      this.distance = parent.distance + edge.weight; 
      this.parent = parent; 
      priorityQueue.remove(this); 
      priorityQueue.add(this); 
     } 
    } 
} 

的問題是線:

priorityQueue.add(本);

由於引用Node類(這是抽象的),它可以不被添加到優先級隊列和實際上應該類型?(節點的子類)在中表示?擴展節點。我如何引用這個子類的類型?

在此先感謝。

+0

相關:http://stackoverflow.com/questions/34513926/is-extends-exclusivity-of-method-parameters – VGR

回答

0

我不確定你想實現什麼。我看到兩個變種。要麼你會用一種類型的節點的子類,然後你可以寫這樣的:

public <T extends Node> void relax(T parent, Edge edge, PriorityQueue<T> priorityQueue) { 
    if (this.distance > parent.distance + edge.weight){ 
     this.distance = parent.distance + edge.weight; 
     this.parent = parent; 
     priorityQueue.remove(this); 
     priorityQueue.add((T) this); 
    } 
} 

或者你只想使用不同類型的節點和混合和匹配他們,但隨後的隊列中的類型將是多麼PriorityQueue<Node>

+0

你明白我的問題恰到好處(遺憾的是缺乏細節)。這個想法是在我的圖中有多種節點(街道交叉等),並使用相同的放鬆功能。 您的解決方案有效。然而,我的IDE(IntelliJ)在說「可疑電話」和「未經檢查的投射」。任何方式來改善這一點? – Tympanix

+0

想法是正確的抱怨。沒有保證,你必須知道你在做什麼。如果您知道只有特定類型的節點將在相同的上下文中使用,則可以使用@SuppressWarning註釋來禁止該警告。儘管你寫了'多種節點使用相同的放鬆功能'。然後,或者你會計算剛過路口之間的距離,然後你可以使用我的第一個建議或者不同節點類型之間的距離,然後你應該只有PriorityQueue ,因爲不會有單一類型的節點。 –

+0

還有一些相關的閱讀:http://stackoverflow.com/questions/37078814/designing-interface-for-hierarchical-entity –