Не удается разрешить «Аргумент типа находится за пределами переменной типа» - PullRequest
2 голосов
/ 28 сентября 2019

У меня есть универсальный класс 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 Ответ

1 голос
/ 28 сентября 2019

Измените эту строку

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 таким образом: посмотрите на метод Collections.binarySearch в библиотеке классов Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...