我有一个类让我们说BImpl实现B接口和C抽象类。这两个超类都有一些像doSomething()这样的方法,它们在抽象类C中实现。
interface B
{
Some doSomething();
}
abstract class C
{
protected Some doSomething()
{
//Do something here...
}
}
我按如下方式实现BImpl:
class BImpl extends C implemensts B
{
public Some doSomething()
{
super.doSomething()
}
}
所以我用B类型对象公开抽象类行为。在这种情况下,我得到PMD(声纳中)违规,说"覆盖方法只调用超类中定义的相同方法"。 这对我来说是不对的,因为我暴露了其他父母的行为。我怎么能避免这个?
答案 0 :(得分:2)
这是此PMD规则的known limitation以及相关的Squid(SonarQube内部)规则。请在下一版Java插件中随意投票解决此问题。
答案 1 :(得分:2)
1)看起来你错过了输入的实现。它应该如下所示:
class BImpl extends C implements B
{
public Some doSomething()
{
super.doSomething()
}
}
因为类不能扩展接口或实现抽象类。
2)根据我对你的问题的理解,BImpl中doSomething()的实现是多余的。
Class BImpl extends C implements B {
}
在逻辑上等同于上述实现。 这就是SONAR发出违规行为的原因。 好吧,如果BImpl中的doSomething()具有与抽象类不同的逻辑。我不认为SONAR会给出任何违规行为,因为没有多余的逻辑。
答案 2 :(得分:1)
如果您不同意一些没有错误的声纳规则,默认配置文件中的某些规则不仅仅是可论证的,只需禁用您用于分析项目的配置文件,违规将在消失后消失接下来分析。
答案 3 :(得分:0)
只是一个想法,类型转换?
public Some doSomething(){
((B)this).doSomething()
}