5

以下代码使用 Sonar + FindBugs 引发“未经检查/未经确认的演员表”严重违规:

1    public static <P extends ComponentContainer & AlignmentHandler> void addComponentAligned(P parent, Component child, Alignment alignment) {
2        parent.addComponent(child);
3        parent.setComponentAlignment(child, alignment);
4    }

关于如何避免这种违规行为的任何想法?

编辑:违规在第 3 行

编辑:方法签名如下: ComponentContainer#addComponent(Component) AlignmentHandler#setComponentAlignment(Component, Alignment)

4

1 回答 1

5

您的源代码中没有强制转换,但在编译产生的字节码中有。在字节码中,泛型类型被擦除。擦除P是它的第一个界限,ComponentContainer. 所以字节码(几乎)等同于以下字节码:

public static void addComponentAligned(ComponentContainer parent, Component child, Alignment alignment) {
    parent.addComponent(child);
    ((AlignmentHandler)parent).setComponentAlignment(child, alignment);
}

Findbugs 查看该字节码,并得出结论,转换为 AlignmentHandler 可能会失败,因为(就 findbugs 所见)该方法接受任何 ComponentContainer。

这是一个 findbugs 错误;你应该打开一个错误报告。在我看来,它就像不需要分析源代码就可以修复的东西。字节码还包含真正的(通用)类型,findbugs 应该使用它。

于 2012-07-05T11:10:04.183 回答