arraylist 中的不安全或未经检查的表达式

Unsafe or unchecked expressions in an arraylist

我正在做一个作业,我必须创建一个可迭代的集合来保存某些阈值之间的二叉树的所有值。二叉树class有一个root变量,它是我写的一个TreeNodeclass的对象。节点仅存储整数值。这是我的方法:

public class Tree {
    public Iterable<Integer> listing(int low, int high) {
            ArrayList<Integer> list=new ArrayList<Integer>();
                 return root.listing(lo, hi, list);
        }
}

public class TreeNode {
    public ArrayList<Integer> listing(int low, int high, ArrayList list) {
        if(this.left!=null) {
            list=this.left.listing(low, high, list);
        }

        if(this.value>=low && this.value<=high) {
            list.add(this.value);
        }

        if(this.right!=null) {
            list=this.right.listing(low, high, list);
        }
        return list;
    }
}

它在本地工作得很好,但我必须将它上传到使用 Java 6 的平台,并且我收到一个错误,它使用未经检查或不安全的操作。 我在 IDE 中收到相同的消息,但这似乎暗示它不是很重要。但是,我必须以某种方式解决这个问题。我尝试阅读 unsafe/unchecked 操作,但我不确定我是否真的理解这里的问题所在。 有什么方法可以在不更改整个代码的情况下解决这个问题吗?

您正在使用 raw type:

public ArrayList<Integer> listing(
        int low, int high, ArrayList list) {
//                         ^^^^^^^^^

这是不安全的,因为这让我可以通过任何类型的 ArrayList:

root.listing(lo, hi, new ArrayList<String>(Arrays.asList("abc")));

使用 ArrayList<Integer> 而不是 ArrayList

这不是错误,而是警告,但正如您所指出的,您可能应该修复它。

问题是您传递的是未绑定的 ArrayList,理论上它可以容纳任何类型的元素,而您只处理 Integer。因此,相反,您可以将参数声明为 ArrayList of Integers:

public ArrayList<Integer> listing(int low, int high, ArrayList<Integer> list) {

编辑:
顺便说一句,方法声明中不需要 ArrayList。因为你在这里唯一关心的是 List 接口而不是它的实现,你可以稍微清理一下声明:

public List<Integer> listing(int low, int high, List<Integer> list) {