如何在内部类中使用参数化泛型类型?

时间:2010-01-05 23:01:23

标签: java generics inner-classes parameterized

我正在尝试实现一个具有通用参数化类型的内部类。

以下是我的代码的简短版本:

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参数类型'隐藏'超类的参数。关于如何解决这个问题的任何想法?

编辑:我添加了另一个我遇到问题的内部类:TreePreOrderIteratorTAVLTreeBinaryNode的通用类型TreePreOrderIterator将相同。内部类需要访问AVLTree中的字段。

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

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

4 个答案:

答案 0 :(得分:28)

如果您希望T中的BinaryNodeT关联的封闭式AVLTree的类型相同,请删除TBinaryNode的声明1}}。

如果您希望T中的BinaryNode与附上的T不同         与AVLTree相关联,但是您         希望能够访问属性         父AVLTree,将T重命名为。{         别的什么。

如果您不需要访问             封闭AVLTree的属性,             将BinaryNode设为静态。

答案 1 :(得分:7)

只需将T重命名为其他内容,这样就不会与外部类T冲突。

类型参数名称在所有类范围中都可见,包括内部类。因此内部类或实例方法应该声明另一个名称与类类型参数冲突的类型参数。但是,静态嵌套类和静态方法没有这个问题。

答案 2 :(得分:1)

只需从BinaryNode类中删除泛型类型声明即可。由于该类被声明为私有,因此它只能存在于AVLTree中,因此您可以在BinaryNode中的任何位置使用为AVLTree声明的T.

答案 3 :(得分:0)

这是因为参数T(作为BinaryNode<T>类的参数)与用于AVLTree<T>的参数相同 - 用于AVLTree的参数通常是在内部类BinaryNode的定义范围内,但由于您为新参数指定了相同的名称,因此它将被隐藏。你可以改用:

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