Небезопасные или непроверенные выражения в массиве

Я делаю назначение, и мне нужно создать повторяемую коллекцию, которая сохраняет все значения двоичного дерева между определенными пороговыми значениями. Класс двоичного дерева имеет корневую переменную, которая является объектом класса TreeNode, который я написал. Узлы хранят только целочисленные значения. Вот мои методы:

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, но, похоже, это подразумевает, что оно не имеет большого значения. Тем не менее, я должен это исправить каким-то образом. Я пытался прочитать о небезопасных / непроверенных операциях, но я не уверен, что действительно понимаю, в чем здесь проблема. Есть ли способ исправить это, не изменяя весь код?

2 ответа

Решение

Это не ошибка, это предупреждение, но, как вы заметили, вы, вероятно, должны это исправить.

Проблема в том, что вы передаете несвязанный ArrayList, что, теоретически, может содержать элементы любого типа, в то время как вы имеете дело только с Integers. Таким образом, вместо этого вы можете объявить свой параметр как ArrayList из Integers:

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

Редактировать:
Между прочим, нет необходимости иметь список массивов в объявлении метода. Поскольку единственное, что вас волнует, это List интерфейс, а не его реализация, вы можете немного прояснить объявление:

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

Вы используете необработанный тип:

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

Это небезопасно, потому что это позволяет мне пройти любой вид ArrayList:

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

использование ArrayList<Integer> вместо ArrayList,

Другие вопросы по тегам