我有一个通用类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 MinPriorityQueueShortestPath.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。
1 回答
慕的地10843
TA贡献1785条经验 获得超8个赞
改变这一行
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
类型。这意味着与 type 的值(它是 的超类型)相当。但在您的版本中,您定义它必须与同一类型相当。如果您还想接受超类型,则必须通过 定义它。ShortestPathVertex<E>
Comparable<ShortestPathVertex<E>>
T
ShortestPathVertex<E>
T
MinPriorityQueue
T
T
<? super T>
您可以尝试(仅用于演示):在方法中Dijkstra
替换每次出现的T
by ShortestPathVertex<E>
。这也适用于更简单的 class 定义MinPriorityQueue
。
这种方式使用的另一个例子super
:查看Collections.binarySearch
Java类库中的方法。
添加回答
举报
0/150
提交
取消