2016-05-06 172 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 –