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