Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在内部类中使用参数化泛型类型?_Java_Generics_Inner Classes_Parameterized - Fatal编程技术网

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

Java 如何在内部类中使用参数化泛型类型?,java,generics,inner-classes,parameterized,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 TreePreOrderIt

我试图实现一个具有泛型参数化类型的内部类

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

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

}

公共类AVLTree只需将
T
重命名为其他名称,这样它就不会与外部类T冲突


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

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

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

private class BinaryNode如果希望
BinaryNode
中的
T
AVLTree
关联的封闭
T
的类型相同,请删除
BinaryNode
中的
T
声明

如果希望
BinaryNode
中的
T
与包含的
T
AVLTree
关联,但您 想要能够访问属性吗 对于父级
AVLTree
,将
T
重命名为 还有别的

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

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

您是否可以编辑您的问题以包括如何使用BinaryNode的泛型类型?e、 例如,BinaryNode的参数化类型是否与AVLTree相同?刚刚编辑。这能回答你的问题吗?好的,谢谢。我将其更改为其他内容,因为我需要访问AVLTree中的属性或字段。问题是我现在得到了一些编译错误,例如,“类型不匹配:无法从AVLTree.treeproordereditor转换为迭代器”和“绑定不匹配:类型T不是绑定参数的有效替代品Try
我删除了T的声明(第一个选项);“I get the error”成员类型AVLTree.TreePreOrderWriter必须使用参数化类型限定,因为它不是静态的。“当我从以前的代码中删除“”时,我得到警告“AVLTree.TreePreOrderWriter是原始类型”。对泛型类型AVLTree.treePreOrderWriter的引用应参数化。“