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

}

这没用。Eclipse/Java 给我一个警告,T内部类的类型参数正在“隐藏”超类的参数。关于如何解决这个问题的任何想法?

编辑:我添加了另一个我遇到问题的内部类:TreePreOrderIterator. 、和的泛型类型T相同。内部类需要访问 AVLTree 中的字段。AVLTreeBinaryNodeTreePreOrderIterator

EDIT2:此外,Iterator访问 a BinaryNode<T>,这是一个冲突。

(注意:这是我正在为一个班级做的更大项目的一部分。如果需要任何其他信息,请询问。)

4

4 回答 4

29

如果您希望Tin与与 关联BinaryNode的封装具有相同的类型,请删除in的声明。TAVLTreeTBinaryNode

如果您希望TinBinaryNode不同于与T 关联的封闭AVLTree,但您希望能够访问 parent 的属性AVLTree,请重命名T为其他内容。

如果您不需要访问封闭的属性,请将其设为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>类的参数)与使用的参数相同AVLTree<T>——使用的参数AVLTree通常在内部类的定义范围内BinaryNode,但是因为你给了一个同名的新参数,它将被隐藏。您可以改为使用:

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