我正在尝试实现一个具有通用参数化类型的内部类。
以下是我的代码的简短版本:
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
和BinaryNode
的通用类型TreePreOrderIterator
将相同。内部类需要访问AVLTree中的字段。
EDIT2:此外,Iterator
访问BinaryNode<T>
,这是一个冲突。
(注意:这是我正在为一堂课做的更大项目的一部分。如果需要任何其他信息,请询问。)
答案 0 :(得分:28)
如果您希望T
中的BinaryNode
与T
关联的封闭式AVLTree
的类型相同,请删除T
中BinaryNode
的声明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>> { ... }