如何覆盖父类的方法但允许可选参数?

时间:2014-07-29 19:25:02

标签: java inheritance

我有:

class A{
    public void foo(String str){
       //do stuff
    }
}

还有:

class B{
    @Override
    public void foo(String str, Integer... i){
       //do different stuff
    }
}

有没有办法不这样做?:

class B{
    public void bar(String str, Integer... i){
       //do different stuff

    @Override
    public void foo(String str){
       if(something)
          bar(str, 1);
       else if(something else)
          super.foo(str);
    }
}

基本上:是否可以在允许可选参数的情况下覆盖父方法,或者这是否从根本上改变了foo的签名?

2 个答案:

答案 0 :(得分:3)

添加可选参数会更改方法的签名,从而阻止覆盖。代码示例中的@Override属性无效。

您可以在JLS第8.4.2节中找到相关详细信息:

  

方法m1的签名是方法m2签名的子签名,如果   之一:

     
      
  • m2m1
  • 具有相同的签名   
  • m1的签名与m2签名的删除(§4.6)相同。
  •   
     

如果m1是[{1}}的子签名,或m2是{{1}的子签名,则两个方法签名m1m2都是覆盖等效的1}}。

您需要使用带有可选参数的签名定义不同的方法,并通过对m2的引用调用基本方法。

答案 1 :(得分:2)

如果签名不匹配,则无法覆盖该方法。

这就是我要做的事情:

class B
{
    public void foo (String str, Integer... i)
    {
       // executed if i.length > 0
    }

    @Override
    public void foo (String str)
    {
       // call super.foo(str) if you wish
       // and/or do some other stuff
    }
}