2016-05-06 9 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

私はあなたが達成したいとは思っていません。私は2つの変種を見る。どちらのあなたは、ノードのサブクラスのいずれかのタイプを使用すると、あなたのような何か書くことができます。

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 –