Общий список Java дает мне предупреждение

Я не понимаю, почему компилятор Java выдает мне предупреждение о непроверенном преобразовании в следующей ситуации:

У меня есть этот класс:

public class NodeTree<T> {
   T value;
   NodeTree parent;
   List<NodeTree<T>> childs;

   NodeTree(T value, NodeTree parent) {
       this.value = value;
       this.parent = parent;
       this.childs = null;
   }

   public T getValue() { return value; }
   public void setValue(T value) { this.value = value; }

   public NodeTree getParent() { return parent; }
   public void setParent(NodeTree parent) { this.parent = parent; }

   public List<NodeTree<T>> getChilds() {
       if (this.childs == null) {
           this.childs = new LinkedList<NodeTree<T>>();
       }
       return this.childs;
   }
}

и в основном классе у меня есть следующие инструкции:

NodeTree node = new NodeTree<Integer>(10, null);

NodeTree<Integer> child = new NodeTree<Integer>(20, node);      
List<NodeTree<Integer>> childs = node.getChilds();

childs.add(child);

Я не могу объяснить, какого черта я получаю предупреждение о строке getChilds() такого типа:

warning: [unchecked] unchecked conversion
List<NodeTree<Integer>> childs = node.getChilds();
                                               ^
required: List<NodeTree<Integer>>
found:    List
1 warning

Функция getChilds() не возвращает тип List, она возвращает тип List ‹ NodeTree ‹ T > >.

Пожалуйста, помогите мне понять.


person MarcoSuma    schedule 29.02.2016    source источник
comment
напишите @SurpressWarning("all") вверху перед названием класса   -  person mo sean    schedule 29.02.2016


Ответы (2)


Не лучше ли было бы использовать код NodeTree<Integer> node = new NodeTree<>(10, null); вместо NodeTree node = new NodeTree<Integer>(10, null); ? Тогда компилятор узнает параметр типа node.

person Gunther Rotsch    schedule 29.02.2016

Вы смешиваете необработанные типы с несырыми типами. По сути, это BadThing(tm). Итак, ваш код

NodeTree node = new NodeTree<Integer>(10, null);

создает переменную узла как необработанный тип, даже если инициализатор не является необработанным типом. Таким образом, для компилятора тип node.getChilds() на самом деле является List, а не List<NodeTree<Integer>>, как вы могли ожидать.

Если вы измените его на...

NodeTree<Integer> node = new NodeTree<Integer>(10, null);

тогда это позволит компилятору отслеживать параметры универсального типа и выполнять всю необходимую проверку типов.

person sisyphus    schedule 29.02.2016