Как я использую paramertized универсальные типы во внутреннем классе?

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

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

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 доступы a BinaryNode<T>, который является конфликтом.

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

17
задан Kirby 16 February 2016 в 18:21
поделиться

3 ответа

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

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

Если тебе не нужен доступ свойства оболочки AVLTree , сделать двоичный узел статическим.

29
ответ дан 30 November 2019 в 11:44
поделиться

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

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

.
7
ответ дан 30 November 2019 в 11:44
поделиться

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

private class BinaryNode<U extends Comparable<? super T>> { ... }
0
ответ дан 30 November 2019 в 11:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: