私は、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)
これで、OSインターフェイスの任意のインスタンスに文字列を渡すことができると期待できますが、Linuxでも確実にそれを行うことができます。
2番目のものがコンパイルに失敗する理由はわかりません。Javaに2番目のプログラムをコンパイルさせた結果のうち、これを禁止する何かが欠けているのでしょうか。