2010-01-05 4 views
15

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

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

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>, что является конфликтом.

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

+0

Вы можете изменить свой вопрос, чтобы указать, как используется общий тип BinaryNode? например, является BinaryNode, параметризованным тем же типом, что и AVLTree? – Carl

+0

Просто отредактирован. Отвечает ли это на ваш вопрос? –

ответ

28

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

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

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

+0

Хорошо, спасибо.Я изменил его на что-то другое, потому что мне нужно получить доступ к свойствам или полям в AVLTree. Проблема: я получаю некоторые ошибки компиляции, например, «Тип несоответствия: невозможно преобразовать из AVLTree.TreePreOrderIterator в Iterator » и «Связанное несоответствие: тип T не является допустимым заменой ограниченного параметра > типа AVLTree .TreePreOrderIterator . " Любые исправления? –

+0

Попробуйте ''. – notnoop

+1

Я удалил объявление T (первый вариант). Теперь, когда я пишу "return new AVLTree.TreePreOrderIterator ();" Я получаю сообщение об ошибке «Тип члена AVLTree.TreePreOrderIterator должен быть квалифицирован с параметризованным типом, поскольку он не является статическим». Когда я удаляю «» из предыдущего кода, я получаю предупреждение «AVLTree.TreePreOrderIterator является сырым типом. Ссылки на общий тип AVLTree .TreePreOrderIterator следует параметризовать». –

7

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

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

0

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

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

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