实现二叉搜索树增强for循环遍历遇类型参数推断错误
解决BSTIterator实例化时的“无法推断类型参数”错误
问题根源
你遇到的错误主要来自两个点:
- 构造方法不匹配:
BSTIterator类只定义了接收E rootData和int size的两参数构造方法,但BinarySearchTree的iterator()方法里,你调用的是三个参数的构造器(比如new BSTIterator<>(root.getData(), size, inOrderQ)),编译器找不到对应构造方法,直接导致类型推断失败。 - 钻石操作符的推断限制:当构造方法参数不明确或不存在时,Java编译器无法通过
<>自动推断泛型类型,进一步触发错误。
修复步骤
步骤1:补充匹配的构造方法
给BSTIterator添加三参数构造方法,同时初始化遍历队列:
public BSTIterator(E rootData, int size, LLQ<E> traversalQueue) { this.rootData = rootData; this.size = size; this.counter = 0; this.traversalQueue = traversalQueue; }
这样BinarySearchTree里的三参数调用就有对应的构造方法了。
步骤2:明确泛型类型(可选但更稳妥)
如果仍存在推断问题,可以在实例化时显式指定泛型类型,替代钻石操作符:
把空树判断的代码从
return new BSTIterator<>(null, 0);
改成
return new BSTIterator<T>(null, 0);
分支里的调用改成:
return new BSTIterator<T>(root.getData(), size, inOrderQ);
直接指定泛型为BinarySearchTree的T,让编译器无需自行推断。
额外优化建议
BSTIterator不需要实现Iterable<E>:迭代器本身只需要实现Iterator<E>即可,Iterable是给集合类用的,用来提供迭代器,去掉这个接口实现能简化代码。- 避免空指针异常:当前
next()方法依赖traversalQueue,如果调用两参数构造器后没调用setTraversalType,会触发空指针,建议在两参数构造器里初始化空队列,或者在next()中加非空判断。
修复后的核心代码示例
修改后的BSTIterator构造方法:
public class BSTIterator<E> implements Iterator<E> { protected E rootData; protected int size; protected int counter; protected TraversalType traversalType; protected LLQ<E> traversalQueue; // 两参数构造器 public BSTIterator(E rootData, int size) { this.rootData = rootData; this.size = size; this.counter = 0; this.traversalQueue = new LLQ<>(); // 初始化空队列避免NPE } // 新增三参数构造器 public BSTIterator(E rootData, int size, LLQ<E> traversalQueue) { this.rootData = rootData; this.size = size; this.counter = 0; this.traversalQueue = traversalQueue; } // 其余方法保持不变... }
修改后的BinarySearchTree的iterator()方法:
public Iterator<T> iterator() { if (root == null) { return new BSTIterator<T>(null, 0); } else { switch (traversalType) { case INORDER: return new BSTIterator<T>(root.getData(), size, inOrderQ); case PREORDER: return new BSTIterator<T>(root.getData(), size, preOrderQ); case POSTORDER: return new BSTIterator<T>(root.getData(), size, postOrderQ); default: return new BSTIterator<T>(null, 0); } } }
内容的提问来源于stack exchange,提问作者Sandy Gied
相关产品推荐
相关产品推荐

