我有一个实现ShortestPathVertex
的通用类Comparable
:
public class ShortestPathVertex<E extends Number> implements VertexInterface, Comparable<ShortestPathVertex<E>>
和另一个需要MinPriorityQueue
类型参数的通用类Comparable
:
public class MinPriorityQueue<T extends Comparable<T>>
我需要创建一个MinPriorityQueue
作为类型参数的ShortestPathVertex
实例:
public static <E extends Number, T extends ShortestPathVertex<E>> void Dijkstra(WeightedDirectedGraph<T, E> G, int s) {
MinPriorityQueue<T> Q = new MinPriorityQueue<>(G.getVertices(), G.V()); // error
}
我编译时会抛出错误:
ShortestPath.java:60: error: type argument T#1 is not within bounds of type-variable T#2
MinPriorityQueue<T> Q = new MinPriorityQueue<>(G.getVertices(), G.V());
^
where T#1,E,T#2 are type-variables:
T#1 extends ShortestPathVertex<E> declared in method <E,T#1>Dijkstra(WeightedDirectedGraph<T#1,E>,int)
E extends Number declared in method <E,T#1>Dijkstra(WeightedDirectedGraph<T#1,E>,int)
T#2 extends Comparable<T#2> declared in class MinPriorityQueue
ShortestPath.java:60: error: cannot infer type arguments for MinPriorityQueue<>
MinPriorityQueue<T> Q = new MinPriorityQueue<>(G.getVertices(), G.V());
^
2 errors
考虑到ShortestPathVertex
实现了Comparable
,我不明白它在抱怨什么。为什么说ShortestPathVertex
不在Comparable
的范围内,我该如何解决。我正在使用Java 7.0。
答案 0 :(得分:1)
更改此行
public class MinPriorityQueue<T extends Comparable<T>>
对此:
public class MinPriorityQueue<T extends Comparable<? super T>>
这里的问题是方法T extends ShortestPathVertex<E>
中的Dijkstra
,因此T
不需要直接实现Comparable
。但这在您的MinPriorityQueue
版本中是必需的。我的更改解决了这个问题。
说明:In MinPriorityQueue<T> Q = ...
T
是ShortestPathVertex<E>
的子类型,它实现了Comparable<ShortestPathVertex<E>>
。这意味着T
与类型ShortestPathVertex<E>
(这是T
的超类型)的值可比。但是,在您的MinPriorityQueue
版本中,您定义T
必须与相同类型T
相当。如果您还想接受超级类型,则必须通过<? super T>
对其进行定义。
您可以尝试(仅用于演示):在方法Dijkstra
中,将T
的每一次出现都替换为ShortestPathVertex<E>
。这也适用于类MinPriorityQueue
的简单定义。
以这种方式使用super
的另一个示例:查看Java类库中的方法Collections.binarySearch
。