Java 如何重写父类';方法,但允许可选参数?

Java 如何重写父类';方法,但允许可选参数?,java,inheritance,Java,Inheritance,我有: 而且: class A{ public void foo(String str){ //do stuff } } 有没有办法不用做就可以做到这一点 class B{ @Override public void foo(String str, Integer... i){ //do different stuff } } 基本上:是否可以在允许可选参数的同时重写父方法,或者这是否从根本上改变了foo的签名?如果签名不匹

我有:

而且:

class A{
    public void foo(String str){
       //do stuff
    }
}
有没有办法不用做就可以做到这一点

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

基本上:是否可以在允许可选参数的同时重写父方法,或者这是否从根本上改变了
foo
的签名?

如果签名不匹配,则无法重写该方法

下面是我要做的:

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);
    }
}

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

有关详细信息,请参见JLS第8.4.2节:

方法
m1
的签名是方法
m2
签名的子签名,如果 要么:

  • m2
    具有与
    m1
    相同的签名,或
  • m1
    的签名与
    m2
    签名的擦除(§4.6)相同
如果
m1
m2
的子签名,或者
m2
m1
的子签名,则两个方法签名
m1
m2
是覆盖等价的


您需要使用带有可选参数的签名定义一个不同的方法,并通过引用
super

调用基方法。您甚至可以将B.bar重命名为B.foo,从而避免在(what was)栏中使用if。现在请删除第一个foo中的if,但请参见Eran的答案和我的注释。在子类中可以有一个具有相同签名重写的方法和一个具有额外参数的附加方法作为重载方法。@laune这是一个正确的观察结果。但是,您正确地说,这将是一个重载,而不是重写:如果您通过类型为
a
的变量访问
B
,则对
foo(xyz)
的调用将被传递到基类中的
foo
,而OP不希望实现这一点。这不是真的。即使有
ax=newb(),也会调用B的foo(字符串x);x、 富(“一”)注意B@laune中有两个foo。我说的是OP的建议,不是Eran的答案。OP希望使用带有附加参数的方法进行重写,而不使用原始签名的方法。
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
    }
}