我们知道方法签名只包括方法名称和参数列表,但不包括方法返回类型.那么为什么我为以下代码收到编译器错误,因为java不区分具有相同签名的方法.
public class InterfaceTest implements I2{
public void hello(){ }
public void world(){ }
}
interface I1{
public int hello();
}
interface I2 extends I1{
public void world();
}
解决方法:
你这里没有overloading,你是overriding和hidding方法,但没有正确的方法….有2种可能解决你的问题:
public class InterfaceTest implements I2{
public void hello(int a){ } // overloaded method
@Override
public int hello(){ return 1; } // overriden method
public void world(){ } // this hides I1 method
}
如果你在一个类中尝试这个,那就是:
public void hello() {}
public int hello() {return 1;}
您将在类型YourClass错误中获得Duplicate方法hello(),因为要在overloading方法中您必须更改签名的FormalParameterListopt:
If two methods of a class […] have the same name but signatures that are not override-equivalent, then the method name is said to be overloaded.
最后但不是最不重要的一点:
方法签名仅包括方法名称和参数列表,但不包括方法返回类型
根据JSL §8.4,当你声明一个方法时:
MethodDeclaration:
MethodHeader MethodBody
MethodHeader:
MethodModifiersopt TypeParametersopt Result MethodDeclarator Throwsopt
MethodDeclarator:
Identifier ( FormalParameterListopt )
所以当你这样做时:
public int hellow(int number) throws Exception;
//| | | | └ throwing an exception (Throwsopt)
//| | | └──────────── receiving one int argument (MethodDeclarator FormalParameterListopt )
//| | └─────────────────── name hellow (MethodDeclarator Identifier)
//| └─────────────────────── returning an int (Result)
//└────────────────────────────── is a public method (MethodModifiersopt)
标签:java,methods,interface
来源: https://codeday.me/bug/20190717/1489087.html