我遇到了java抽象类和泛型函数的问题。该实现是Dijkstra算法图中的节点类。
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 :(得分: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>
。