Небезопасные или непроверенные выражения в массиве
Я делаю назначение, и мне нужно создать повторяемую коллекцию, которая сохраняет все значения двоичного дерева между определенными пороговыми значениями. Класс двоичного дерева имеет корневую переменную, которая является объектом класса 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
, что, теоретически, может содержать элементы любого типа, в то время как вы имеете дело только с Integer
s. Таким образом, вместо этого вы можете объявить свой параметр как ArrayList
из Integer
s:
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
,