Java抽象方法签名

Pau*_*per 0 java methods polymorphism inheritance abstract

我对Java类实现的抽象方法签名感到很困惑.

例如,考虑:

interface Programmer {
    Object program();
}

class Linus implements Programmer {
    public String program() {
        return "goto end;";
    }
}

public class Main {
    public static void main(String[] args) {
        System.out.println(new Linus().program());
    }
}
Run Code Online (Sandbox Code Playgroud)

这显然是可以接受的,因为任何期望来自Linus.program()的Object都会得到一个(特别是一个String).

但现在考虑一下:

interface OS {
    void run(String code);
}

class Linux implements OS {
    public void run(Object code) {
        System.out.println("Hello world");
    }
}

public class Main {
    public static void main(String[] args) {
    new Linux().run("print 'Hello world'");
    }
}
Run Code Online (Sandbox Code Playgroud)

这无法编译,并产生错误:

The type Linux must implement the inherited abstract method OS.run(String)
Run Code Online (Sandbox Code Playgroud)

现在,任何人都可以期望能够将String传递到OS接口的任何实例中,并且您当然可以使用Linux来实现.

我认为没有理由为什么第二个无法编译.在Java编译第二个程序的后果中,我是否遗漏了一些令人望而却步的东西?

asi*_*d88 5

你正在为第二种情况做的是方法过载.
方法的签名是"方法名称"和"参数的数量和类型"
在第二种情况下,您正在更改编译器事物是另一种方法的参数类型,并要求您实现抽象(未实现)方法.如果您实现接口中存在的方法,public void run(String code)则此方法public void run(Object code)将被视为重载方法.

注意:方法覆盖永远不会基于方法的返回类型.由于返回类型不被视为方法的签名