17

ジェネリック パラメーター化された型を持つ内部クラスを実装しようとしています。

ここに私のコードの短いバージョンがあります:

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> {
  ...
 }

}

それは動作しません。TEclipse/Javaから、内部クラスの型パラメーターがスーパー クラスのパラメーターを「隠している」という警告が表示されます。これを修正する方法について何か考えはありますか?

編集:問題がある他の内部クラスを追加しました: TreePreOrderIterator. 、、およびのジェネリック型Tは同じになります。内部クラスは、AVLTree のフィールドにアクセスする必要があります。AVLTreeBinaryNodeTreePreOrderIterator

EDIT2: また、 は競合Iteratorする a にアクセスします。BinaryNode<T>

(注: これは私がクラスで行っているより大きなプロジェクトの一部です。他の情報が必要な場合は、お問い合わせください。)

4

4 に答える 4

29

Tinを に関連付けられてBinaryNodeいるエンクロージングと同じ型にしたい場合は、 inの宣言を削除します。TAVLTreeTBinaryNode

Tinを に 関連付けられBinaryNodeたエンクロージングとは異なるものにしたいが、parent のプロパティにアクセスできるようにしたい場合は、名前を別の名前に変更します。TAVLTreeAVLTreeT

AVLTree囲んでいる のプロパティにアクセスする必要がない場合は、BinaryNode静的にします。

于 2010-01-05T23:13:13.427 に答える
7

T外部クラス T と競合しないように、別の名前に変更するだけです。

型パラメーター名は、内部クラスを含むすべてのクラス スコープで表示されます。そのため、内部クラスまたはインスタンス メソッドは、名前がクラスの型パラメーターと競合する別の型パラメーターを宣言する必要があります。ただし、静的なネストされたクラスと静的メソッドにはその問題はありません。

于 2010-01-05T23:03:34.563 に答える
1

BinaryNode クラスからジェネリック型宣言を削除するだけです。クラスは非公開と宣言されているため、AVLTree 内にのみ存在できます。そのため、BinaryNode 内のどこでも、AVLTree に対して宣言された T を使用できます。

于 2011-08-02T20:30:12.477 に答える
0

これは、パラメーターT(BinaryNode<T>クラスのパラメーターとして) が for に使用されるものと同じであるためです。AVLTree<T>-- に使用されるパラメーターAVLTreeは通常、内部クラスの定義のスコープ内にありBinaryNodeますが、新しいパラメーターに同じ名前を付けているためです。それは隠されます。代わりに次を使用できます。

private class BinaryNode<U extends Comparable<? super T>> { ... }
于 2010-01-05T23:06:46.703 に答える