使用泛型多边界未经检查/未经确认的强制转换

时间:2012-07-02 16:57:21

标签: java generics casting sonarqube findbugs

以下代码使用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(组件) AlignmentHandler #setComponentAlignment(Component,Alignment)

1 个答案:

答案 0 :(得分: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应该使用它。