未选中的列表转换警告

时间:2018-07-03 12:57:03

标签: java unchecked-conversion

当我用-Xlint:unchecked编译我的Java代码时,在此行:

            List<HierarchyNode> list = hier.getHierarchyNodesParentFirst(0);

我收到这个:

... unchecked conversion
required: java.util.List<ir.ac.ut.iis.person.hierarchy.HierarchyNode>
found:    java.util.List

getHierarchyNodesParentFirst定义为:

public class Hierarchy<U extends User> {
    ...
    public List<HierarchyNode> getHierarchyNodesParentFirst(int owner) {
        List<HierarchyNode> hierarchyNodesChildFirst = getHierarchyNodesChildFirst(owner);
        ...
        return hierarchyNodesChildFirst;
    }
}

它不会在任何地方被覆盖,也不会覆盖任何东西。问题是什么?

1 个答案:

答案 0 :(得分:1)

在注释中,您声明已与UPDATE s SET s.x10 = 'x' FROM Sales s OUTER APPLY ( SELECT TOP 1 quantity FROM sales s2 WHERE s2.Article_code = s.Article_code AND s2.date < s.date ORDER BY s2.date DESC ) t WHERE s.quantity = 10 * t.quantity; 一样定义了变量hier。这导致了未经检查的警告,因为您在变量声明中遗漏了类型变量。该警告不是由Hierachy hier = new Hierarchy<>();List之间的无效转换引起的,就像最初通过阅读编译器警告可能想到的那样。

下面的示例应该可以解决问题:

List<HierarchyNode>

或替代(可能不希望这样做)

Hierarchy<? extends User> hier = new Hierarchy<>();
List<HierarchyNode> list = hier.getHierarchyNodesParentFirst(0);

编辑:您还可以从类Hierarchy hier = new Hierarchy<>(); List list = hier.getHierachyNodesParentFirst(0); 中删除通用参数<U extends User>。显然,这可能不是您想要的,但是它强调,由于没有类型,因此不会发生类型擦除,并且代码将在没有警告的情况下进行编译。

这是由于类型擦除引起的。 There's some discussion in StackOverflow