以下代码使用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)
答案 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应该使用它。