Java: возникли проблемы с реализацией интерфейса ограниченных дженериков

Я просмотрел множество вопросов и других статей в Интернете, но, похоже, не могу найти тот, который подходит для моего конкретного случая, и ни одно из других решений не помогло мне.

У меня есть этот интерфейс здесь:

public interface PriorityQueueInterface<T extends Comparable<? super T>>

Мне нужно создать класс приоритетной очереди для реализации этого интерфейса, поэтому я напечатал его так:

public class ArrayPriorityQueue<T> implements PriorityQueueInterface<Comparable<? super T>>

Однако он не компилируется, так как я получаю эту ошибку:

Аргумент типа Comparable не находится в границах переменной типа T#2, где T#1,T#2 являются переменными типа: T#1 extends Object, объявленный в классе ArrayPriorityQueue T#2 extends Comparable, объявленный в интерфейсе PriorityQueueInterface

Я пробовал все типы комбинаций, но ничего не работает. Как мне написать объявление класса, чтобы оно скомпилировалось?


person gameCoder95    schedule 04.08.2016    source источник
comment
PriorityQueueInterface› Не похоже на допустимое имя интерфейса. Вы уверены, что правильно написали здесь?   -  person Maybe_Factor    schedule 04.08.2016


Ответы (1)


Похоже, вы хотите объявить переменную типа с той же привязкой, а затем передать ее в качестве аргумента интерфейсу:

public class ArrayPriorityQueue<T extends Comparable<? super T>>
    implements PriorityQueueInterface<T> {...}
person Radiodef    schedule 04.08.2016
comment
Что ж, это было легко, большое спасибо! Я новичок в дженериках, поэтому, если можете, объясните мне, что оператор T расширяет Comparable‹? значит супер Т››? У меня есть небольшая идея после поиска, но мне все еще трудно понять эту конкретную строку. - person gameCoder95; 04.08.2016
comment
T extends Comparable<T> означает, что T должен реализовать интерфейс Comparable. T передается в Comparable в качестве аргумента в Comparable<T>, потому что класс, реализующий Comparable, всегда должен предоставлять себя в качестве аргумента, например class String implements Comparable<String>. Часть ? super T просто делает границу немного более допустимой, позволяя нам иметь ситуацию, подобную class A implements Comparable<A> и class B extends A. B — это Comparable<A>, поэтому привязка более простого типа отклонит его в качестве аргумента. - person Radiodef; 04.08.2016
comment
Потрясающее объяснение, спасибо! Это помогло мне понять это намного лучше. У меня есть еще один небольшой вопрос: в приведенном выше классе ArrayPriorityQueue, как бы вы создали массив из объектов T? По-видимому, (T[])new Object[size] выдает исключение времени выполнения, потому что, по-видимому, он не может привести к нему Comparable. - person gameCoder95; 05.08.2016
comment
(T[]) new Comparable<?>[size]. (T стирается до связанного с ним типа Comparable, поэтому вы используете его вместо Object.) Если вы делаете общие массивы таким образом, обратите внимание, что вы никогда не можете выставлять массив вне класса, иначе он вызовет исключение. Он должен быть private, и вы не можете вернуть его с помощью метода. - person Radiodef; 05.08.2016