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

Rom*_*man 5 java generics casting findbugs sonarqube

以下代码使用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    }
Run Code Online (Sandbox Code Playgroud)

我应该如何避免这种违规?

编辑:违规行为在第3行

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

Wou*_*rts 5

您的源代码中没有强制转换,但在编译产生的字节码中有.在字节码中,通用类型被擦除.擦除P是它的第一个约束,ComponentContainer.所以字节码(几乎)等于这个字节码:

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

Findbugs查看该字节码,并得出结论,转换为AlignmentHandler可能会失败,因为(就像findbugs看到的那样)该方法接受任何ComponentContainer.

这是一个findbugs的bug; 你应该打开一个错误报告.它看起来像是可以修复的东西而无需分析源代码.字节码还包含真实(通用)类型,findbugs应该使用它.