我不明白为什么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&lt; NodeTree&lt; T> &GT;类型。
请帮助我理解。
答案 0 :(得分:1)
编码NodeTree<Integer> node = new NodeTree<>(10, null);
不是更好吗
而不是NodeTree node = new NodeTree<Integer>(10, null);
?然后编译器将知道node
的类型参数。
答案 1 :(得分:1)
您将原始类型与非原始类型混合在一起。这基本上是BadThing(tm)。所以你的代码
NodeTree node = new NodeTree<Integer>(10, null);
将节点变量创建为原始类型,即使初始化者不是原始类型也是如此。因此,对于编译器,node.getChilds()
的类型实际上是List
而不是List<NodeTree<Integer>>
,正如您可能期望的那样。
如果您将其更改为...
NodeTree<Integer> node = new NodeTree<Integer>(10, null);
然后,这将允许编译器跟踪泛型类型参数并执行它需要的所有类型检查。