Ошибка в этой строке:
public class PQTreeQueue<Integer> extends AbstractQueue<Integer>
Это (первая часть) является синтаксис для объявления обобщенного класса. Когда вы объявляете общий класс, идентификатор в угловых скобках является параметром типа . Это так же, как в декларации Java
public class ArrayList<E> ...
за исключением того, что вы назвали ваш параметр типа Integer
вместо E
. Компилятор обрабатывает Integer
так же, как обрабатывает E
, хотя - он становится параметром типа, который может быть заменен любым фактическим типом, а тот факт, что имя Integer
используется для других вещей в Java, не имеет смысла. Общий тип теряет все соединение с Integer
. И везде в этом классе Integer
будет ссылаться на переменную типа, а не на фактический java.lang.Integer
.
Если удалить <Integer>
:
public class PQTreeQueue extends AbstractQueue<Integer>
все должно работать. (.? Помимо того, что компаратор, который никогда не возвращает 0 не будет работать Что произойдет, если вы звоните compare(x, x)
ли будет сказать, что x > x
?)
MORE информации о требованиях к компараторам: Математический правила заключаются в том, что компаратор налагает полное упорядочение, что означает, что функция должна подчиняться правилам для общего упорядочения (включая транзитивность). Согласно the javadoc for compare(), «Разработчик должен обеспечить, чтобы sgn(compare(x, y)) == -sgn(compare(y, x))
для всех x и y». Это означает, в частности, что sgn(compare(x,x)) == -sgn(compare(x,x))
, и это возможно только в том случае, если compare(x,x) == 0
. Это доказывает, что компаратор, который никогда не возвращает 0, нарушает правила, так как compare
должен возвращать 0, когда оба аргумента равны ==
. [Правило слабее в отношении аргументов, которые не являются ==
, но равны в соответствии с .equals()
; javadoc не говорит, что вы не должны этого делать, но он говорит, что это может привести к тому, что вещи, подобные сортированным наборам и картам, будут вести себя странно.См. http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html.]
Сторона примечания: компаратор, который никогда не возвращает 0, не является допустимым компаратором. Я не знаю, чего вы пытаетесь сделать, написав компаратор, который никогда не возвращает 0, но это вызовет проблемы. – ajb
Я добавил примечание к моему ответу, объяснив, почему это не является допустимым компаратором. – ajb