Я пытаюсь реализовать внутренний класс, который имеет универсальный параметризованный тип.
Вот короткая версия моего кода:
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>
, который является конфликтом.
(Примечание: Это - часть большего проекта, который я делаю для класса. Если информация необходима, спросите.)
Если Вы хотите, чтобы T
в BinaryNode
был того же типа, что и прилагаемое T
, связанное с AVLTree
, удалите заявление T
в BinaryNode
.
Если Вы хотите, чтобы T
в BinaryNode
отличался от прилагаемого T
.
связанный с AVLTree
, но вы
хотят иметь доступ к собственности
родительского AVLTree
, переименовать T
в
что-нибудь еще.
Если тебе не нужен доступ
свойства оболочки AVLTree
,
сделать двоичный узел
статическим.
Просто переименуйте T
во что-нибудь другое, чтобы не конфликтовать с внешним классом T.
Имена параметров типа видны во всей области видимости класса, включая внутренние классы. Поэтому внутренние классы или методы экземпляров должны объявить еще один параметр типа, имя которого конфликтует с параметром типа класса. Однако статические вложенные классы и статические методы не имеют такой проблемы
. Потому что параметр T
(как параметр для класса BinaryNode
) совпадает с параметром, используемым для AVLTree
- - параметр, используемый для AVLTree
, обычно используется для определения внутреннего класса BinaryNode
, но так как вы даете новому параметру то же имя, он будет скрыт. Вместо этого можно использовать:
private class BinaryNode<U extends Comparable<? super T>> { ... }