Как использовать параметризованные универсальные типы во внутреннем классе? - PullRequest
16 голосов
/ 06 января 2010

Я пытаюсь реализовать внутренний класс, имеющий универсальный параметризованный тип.

Вот краткая версия моего кода:

public class AVLTree<T extends Comparable<? super T>> implements Iterable<T> {
 ...

 private class BinaryNode<T extends Comparable<? super T>> {
  ...
 }

 private class TreePreOrderIterator<E extends Comparable<? super E>> implements Iterator<E> {
  ...
 }

}

Не работает. Eclipse / Java предупреждает меня, что параметр типа T во внутреннем классе «скрывает» параметр суперкласса. Любые мысли о том, как я могу это исправить?

РЕДАКТИРОВАТЬ: я добавил другой внутренний класс, с которым у меня проблемы: TreePreOrderIterator. Универсальный тип T будет одинаковым для AVLTree, BinaryNode и TreePreOrderIterator. Внутренние классы должны обращаться к полям в AVLTree.

EDIT2: Кроме того, Iterator обращается к BinaryNode<T>, что является конфликтом.

(Примечание: это часть более крупного проекта, который я делаю для класса. Если вам нужна какая-либо другая информация, пожалуйста, спросите.)

Ответы [ 4 ]

28 голосов
/ 06 января 2010

Если вы хотите, чтобы T в BinaryNode был того же типа, что и вложенный T, связанный с AVLTree, удалите объявление T в BinaryNode.

Если вы хотите, чтобы T in BinaryNode отличался от прилагаемого T связан с AVLTree, но вы хотите иметь возможность доступа к свойствам родителя AVLTree, переименуйте T в что-то еще.

Если вам не нужен доступ свойства ограждающих конструкций AVLTree, сделать BinaryNode статичным.

7 голосов
/ 06 января 2010

Просто переименуйте T во что-то другое, чтобы оно не конфликтовало с внешним классом T.

Имена параметров типа видны во всех областях видимости класса, включая внутренние классы. Таким образом, внутренние классы или методы экземпляра должны объявить еще один параметр типа, чье имя конфликтует с параметром типа класса. Однако у статических вложенных классов и статических методов такой проблемы нет.

1 голос
/ 03 августа 2011

Просто удалите объявление универсального типа из класса BinaryNode. Поскольку класс объявлен как закрытый, он может существовать только внутри AVLTree, и поэтому вы можете просто использовать T, объявленный для AVLTree, где угодно внутри BinaryNode.

0 голосов
/ 06 января 2010

Это потому, что параметр T (как параметр для класса BinaryNode<T>) такой же, как и используемый для AVLTree<T> - параметр, используемый для AVLTree, обычно находится в области видимости определения класс BinaryNode, но поскольку вы даете новому параметру то же имя, он будет скрыт. Вместо этого вы можете использовать:

private class BinaryNode<U extends Comparable<? super T>> { ... }
...