【问题标题】:Java abstract method signatureJava 抽象方法签名
【发布时间】:2013-02-24 21:10:36
【问题描述】:

我对 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)

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

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

【问题讨论】:

    标签: java inheritance methods polymorphism abstract


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您不能传递基类 Object 的实例来代替 String 类的实例,但反之亦然。在您的界面操作系统中,run 方法的参数是 String 类型,而在实现类中,您将参数概括为 Object 类型,这是不允许的。因此,编译器会抱怨。

      【讨论】:

      • 这个就不解释了。我正在调用 Linux 基类。如果我正在调用操作系统接口,那么这一点将是有效的。 Linux 基类接受所有对象,包括字符串。
      • 底线是你不能改变接口强制执行的合约中的参数。在这里,您将参数的类型从 String 更改为 Object,这在技术上使其成为新的方法定义,而不是接口协定的实现,因此会出现错误。
      【解决方案3】:

      你说“现在,任何东西都可以将字符串传递到操作系统接口的任何实例中,你当然可以在 Linux 上做到这一点。” => 问题是你可以,但不是必须的。

      考虑一下:由于该方法的 Linux 版本将 Object 作为参数,因此您可以尝试传递一个 Collection,例如。因此,您不会尊重接口,它明确地将参数限制为字符串。这就是为什么 Linux 版本的方法不被认为是 OS 版本的“子”。

      由于接口中的每个方法都需要有其“子”,编译器会抱怨您没有为 OS.run(String) 实现“子”

      【讨论】:

      • 那么什么是模棱两可或无法工作的代码?
      猜你喜欢
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 2011-08-01
      • 2011-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2020-11-08
      相关资源
      最近更新 更多