📌  相关文章
📜  具有相同方法的两个接口具有相同的签名但不同的返回类型

📅  最后修改于: 2022-05-13 01:54:26.175000             🧑  作者: Mango

具有相同方法的两个接口具有相同的签名但不同的返回类型

Java不支持多重继承,但是我们可以通过接口实现多重继承的效果。在接口中,一个类可以实现多个接口,而这些接口不能通过 extends 关键字来实现。
有关更多信息,请参阅Java中的多重继承。
假设我们有两个接口具有相同的方法名称(geek)和不同的返回类型(int 和 String)

public interface InterfaceX
{
    public int geek();
}
public interface InterfaceY
{
    public String geek();
}

现在,假设我们有一个实现这两个接口的类:

public class Testing implements InterfaceX, InterfaceY
{
public String geek()
    {
        return "hello";
    }
}

问题是:一个java类能否Java两个具有相同方法的接口,具有相同的签名但不同的返回类型?
不,这是一个错误
如果两个接口包含一个签名相同但返回类型不同的方法,则不可能同时实现这两个接口。
根据 JLS(§8.4.2),在这种情况下不允许使用具有相同签名的方法。

Two methods or constructors, M and N, have the same signature if they have,
the same name
the same type parameters (if any) (§8.4.4), and
after adopting the formal parameter types of N 
 to the type parameters of M, the same formal parameter types.

在一个类中声明两个具有重写等效签名的方法是编译时错误。

// JAVA program to illustrate the behavior
// of program when two interfaces having same 
// methods and different return-type
interface bishal
{
public
    void show();
}
  
interface geeks
{
public
    int show();
}
  
class Test implements bishal, geeks
{
    void show() // Overloaded method based on return type, Error
    {
    }
    int show() // Error
    {
        return 1;
    }
public
    static void main(String args[])
    {
    }
}

输出:

error: method show() is already defined in class Test
error: Test is not abstract and does not override abstract method show() in geeks
error: show() in Test cannot implement show() in bishal
// Java program to illustrate the behavior of the program
// when two interfaces having the same methods and different return-type
// and we defined the method in the child class
interface InterfaceA
{
public
    int fun();
}
interface InterfaceB
{
public
    String moreFun();
}
  
class MainClass implements InterfaceA, InterfaceB
{
public
    String getStuff()
    {
        return "one";
    }
}
error: MainClass is not abstract and does not override abstract method fun() in InterfaceA