L'erreur est sur cette ligne:
public class PQTreeQueue<Integer> extends AbstractQueue<Integer>
Ce (la première partie) est la syntaxe pour déclarer une classe générique. Lorsque vous déclarez une classe générique, l'identificateur entre chevrons est un paramètre de type . Il est comme la déclaration en Java
public class ArrayList<E> ...
sauf que vous avez appelé votre paramètre de type Integer
au lieu de E
. Le compilateur traite Integer
de la même manière qu'il traite E
, cependant - il devient un paramètre de type qui peut être remplacé par n'importe quel type réel, et le fait que le nom Integer
soit utilisé pour d'autres choses en Java n'a pas de sens. Le type générique perd toute connexion avec Integer
. Et partout ailleurs dans cette classe, Integer
fera référence à la variable de type, pas à la réelle java.lang.Integer
.
Si vous supprimez <Integer>
:
public class PQTreeQueue extends AbstractQueue<Integer>
tout devrait fonctionner. (.? Mis à part le fait qu'un comparateur qui ne retourne jamais 0 ne fonctionnera pas ce qui arriverait si vous appelez compare(x, x)
Est-ce que ça va dire que x > x
?)
Plus informations sur les exigences de comparateurs: La mathématique les règles sont qu'un comparateur impose un ordre total, ce qui signifie que la fonction doit obéir aux règles pour un ordre total (y compris la transitivité). Selon the javadoc for compare(), "L'implémenteur doit s'assurer que sgn(compare(x, y)) == -sgn(compare(y, x))
pour tout x et y." Cela signifie, en particulier, que sgn(compare(x,x)) == -sgn(compare(x,x))
, et cela n'est possible que si compare(x,x) == 0
. Cela prouve qu'un comparateur qui ne renvoie jamais 0 viole les règles, puisque compare
doit renvoyer 0 lorsque les deux arguments sont ==
. [La règle est plus faible en ce qui concerne les arguments qui ne sont pas ==
mais sont égaux selon .equals()
; le javadoc ne dit pas que vous ne devez pas le faire, mais il dit que cela pourrait provoquer des choses comme des ensembles et des cartes triés à se comporter étrangement.Voir http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html.]
Note de côté: un comparateur qui ne retourne jamais 0 n'est pas un comparateur valide. Je ne sais pas ce que vous essayez d'accomplir en écrivant un comparateur qui ne retourne jamais 0, mais cela posera des problèmes. – ajb
J'ai ajouté une note à ma réponse pour expliquer pourquoi ce comparateur n'est pas valide. – ajb