2010-01-05 1 views
15

제네릭 매개 변수가있는 내부 클래스를 구현하려고합니다. 그것은 작동하지 않습니다내부 클래스에서 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. 일반 유형 TAVLTree, BinaryNodeTreePreOrderIterator과 동일합니다. 내부 클래스는 AVLTree의 필드에 액세스해야합니다.

EDIT2 : 또한 IteratorBinaryNode<T>에 액세스합니다. 이는 충돌입니다.

(참고 :. 기타 정보가 필요한 경우이 나는 수업하고있어 더 큰 프로젝트의 일부입니다, 문의하시기 바랍니다.)

+0

BinaryNode의 일반적인 유형이 사용되는 방법을 포함하도록 질문을 편집 할 수 있습니까? 예를 들어 AVLTree와 동일한 유형으로 매개 변수화 된 BinaryNode입니까? – Carl

+0

방금 ​​편집했습니다. 이 질문에 대한 대답이 있습니까? –

답변

28

당신이 AVLTree과 관련된 둘러싸 T과 같은 유형이 될 BinaryNodeT의 선언을 제거 BinaryNode에서 T을합니다.

당신은 BinaryNodeTAVLTree과 관련된 둘러싸 T 다른되고 싶어하지만, 부모 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

그것은합니다 (BinaryNode<T> 클래스의 매개 변수로) 매개 변수 TAVLTree<T>에 사용 된 것과 동일하기 때문에 것 - AVLTree에 사용되는 매개 변수는 내부 클래스 BinaryNode의 정의 범위에 일반적이지만, 때문에 ' 새 매개 변수에 동일한 이름을 지정하면 숨겨집니다. 대신 사용할 수 있습니다

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

BinaryNode 클래스에서 제네릭 형식 선언을 제거하면됩니다. 클래스는 private로 선언되었으므로 AVLTree 내에 만 존재할 수 있으므로 BinaryNode 내부의 AVLTree에 선언 된 T를 사용할 수 있습니다.