binaryTree.java使用compareTo()报未检查或不安全操作错误如何解决
问题原因与修复方案
- 原生
Comparable未指定泛型导致的编译问题
你使用了无泛型约束的java.lang.Comparable作为key的类型,compareTo方法的默认入参为Object类型,如果TreeNode类的key字段声明类型不是Object,就会触发类型不匹配的编译报错。你可以给方法添加泛型约束,保证比较的两个key类型一致:
- 原生
// 方法定义修改为带泛型约束的形式 public <K extends Comparable<K>> Object insert(K key, Object value)
compareTo返回值判断不符合接口规范Comparable接口的规范仅要求compareTo返回负整数、零、正整数三类结果,并没有规定正负值必须为-1和1,例如String、Integer的compareTo实现都会返回非1/-1的正负值,你当前判断等于1/-1的逻辑会完全失效。
- 空指针与插入逻辑错误
你当前的循环逻辑会在cur被赋值为null后,仍然尝试访问cur.key触发空指针;同时最后仅给局部变量cur赋值为新节点,没有把新节点挂到父节点的对应子树上,插入操作完全不会更新树结构。
- 空指针与插入逻辑错误
完整修正后的代码
public <K extends Comparable<K>> Object insert(K key, Object value){ TreeNode insertable = new TreeNode(); insertable.key = key; insertable.value = value; if (this.getRoot() == null){ root = insertable; return value; } TreeNode cur = this.getRoot(); TreeNode parent = null; // 新增父节点记录 int compareRes = 0; while(cur != null){ parent = cur; compareRes = key.compareTo(cur.key); if(compareRes == 0){ Object oldVal = cur.value; cur.value = value; return oldVal; } if(compareRes > 0){ cur = cur.right; }else{ cur = cur.left; } } // 把新节点挂到父节点对应的子树上 if(compareRes > 0){ parent.right = insertable; }else{ parent.left = insertable; } return value; }
内容的提问来源于stack exchange,提问作者Max Aquino
相关产品推荐
相关产品推荐

