Я совершенно запутался в сигнатурах абстрактных методов, которые реализуют классы 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());
}
}
Это, по-видимому, приемлемо, поскольку все, что ожидает Object от Linus.program(), получит его (в частности, 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'");
}
}
Это не скомпилируется и выдает ошибку:
The type Linux must implement the inherited abstract method OS.run(String)
Теперь можно было ожидать, что что угодно сможет передать String в любой экземпляр интерфейса ОС, и вы, безусловно, можете сделать это с Linux.
Я не вижу причин, по которым второй не может скомпилироваться. Из последствий того, что Java скомпилирует вторую программу, я упустил что-то, что делает это запретительным?