我有:
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
的签名?
答案 0 :(得分:3)
添加可选参数会更改方法的签名,从而阻止覆盖。代码示例中的@Override
属性无效。
您可以在JLS第8.4.2节中找到相关详细信息:
方法
m1
的签名是方法m2
签名的子签名,如果 之一:
- 具有相同的签名
m2
与m1
或m1
的签名与m2
签名的删除(§4.6)相同。如果
m1
是[{1}}的子签名,或m2
是{{1}的子签名,则两个方法签名m1
和m2
都是覆盖等效的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
}
}