2016-02-29 2 views
1

Я не понимаю, почему 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() функция не возвращает типа списка, он возвращает список < < NodeTree T>> типа.

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

+0

напишите '@SurpressWarning (« все »)' вверху перед именем класса –

ответ

1

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

1

Вы смешиваете сырые типы с не сырыми типами. Это в основном BadThing (tm). Таким образом, ваш код

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

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

Если изменить это будет ...

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

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

Смежные вопросы