无法解决“类型参数不在类型变量的范围内”错误

时间:2019-09-28 08:32:17

标签: java generics

我有一个实现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。

1 个答案:

答案 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 = ... TShortestPathVertex<E>的子类型,它实现了Comparable<ShortestPathVertex<E>>。这意味着T与类型ShortestPathVertex<E>(这是T的超类型)的值可比。但是,在您的MinPriorityQueue版本中,您定义T必须与相同类型T相当。如果您还想接受超级类型,则必须通过<? super T>对其进行定义。

您可以尝试(仅用于演示):在方法Dijkstra中,将T的每一次出现都替换为ShortestPathVertex<E>。这也适用于类MinPriorityQueue的简单定义。

以这种方式使用super的另一个示例:查看Java类库中的方法Collections.binarySearch