Java抽象方法签名

标签 java inheritance methods polymorphism 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());
    }
}

这显然是可以接受的,因为任何期望来自 Linus.program() 的对象都会得到一个(特别是字符串)。

但现在考虑一下:

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

编译失败,并产生错误:

The type Linux must implement the inherited abstract method OS.run(String)

现在,任何东西都可以将字符串传递到操作系统接口(interface)的任何实例中,并且您当然可以使用 Linux 来做到这一点。

我看不出第二个编译失败的原因。让 Java 编译第二个程序的后果中,我是否遗漏了一些导致这种情况令人望而却步的东西?

最佳答案

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

注意:方法重写永远不会基于方法的返回类型。由于返回类型不被视为方法的签名

关于Java抽象方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15308986/

相关文章:

java - 如何在 Hibernate 中模拟复合键?

java - Thorntail-示例/API 不兼容

c# - 基类实现抽象时在派生类中指定实现接口(interface)

java - Spring数据JPA + Hibernate : How do I use a repository on abstract super class for object retrieval?

hibernate - 如何使域实例关联无效/刷新?

java - eclipse 在启动时崩溃

java - 你能解释一下下面的java代码吗?它是Java输出格式化主题

javascript - 对象函数没有方法(我不是 javascript 编码器)

ios - 发送到实例的无法识别的选择器?

c# - C#/C++ 中缓存或预计算的不可变函数