неявный супер-интерфейс в Java? - PullRequest
3 голосов
/ 29 апреля 2009

Итак, мы все знаем, что все классы неявно расширяют Object. Как насчет интерфейсов? Есть ли неявный суперинтерфейс? Я говорю, что есть. Следующий код компилируется:

java.io.Serializable s1 = null;
java.io.Serializable s2 = null;

s1.equals(s2);

Метод equals не объявлен в Serializable, но в Object. Поскольку интерфейсы могут расширять только другие интерфейсы, а Object является классом, а не интерфейсом, должен существовать некоторый неявный расширяемый интерфейс. И класс Object должен затем неявно реализовать этот неявный интерфейс (вау, это было странно писать).

Итак, вопрос в том, насколько это правильно?

Ответы [ 4 ]

15 голосов
/ 29 апреля 2009

Поскольку интерфейсы могут расширять только другие интерфейсы, а объект является классом, а не интерфейс, должно быть какое-то неявный интерфейс, который в настоящее время продлены.

Нет. Ссылаясь на Спецификацию языка Java :

Если интерфейс не имеет прямого суперинтерфейсы, затем интерфейс неявно объявляет публичный реферат метод-член m с сигнатурой s, возвращает тип r и выбрасывает предложение t соответствует каждому общедоступному экземпляру метод m с сигнатурой s, тип возвращаемого значения r и выбрасывает условие t , объявленное в Объект , если метод с тем же подпись, тот же тип возврата и Совместимость бросков оговорка явно объявлено интерфейсом. Это ошибка времени компиляции, если интерфейс явно объявляет такой метод м в случае где m объявлен окончательным в Объект.

Разница между этим и вашим "неявным суперинтерфейсом" заключается в том, что Object имеет несколько финальных и защищенных методов, и вы не можете иметь эти модификаторы в интерфейсе.

7 голосов
/ 29 апреля 2009

s1 и s2 здесь - это ссылки на объекты, ссылающиеся на экземпляры объектов, которые реализуют Serializable. В Java нет такой вещи как ссылка на интерфейс.

Так что Java знает, что какими бы ни были эти объекты, они происходят от java.lang.Object. Следовательно, приведенный выше код действителен.

0 голосов
/ 29 апреля 2009

Не думаю, что есть какой-то супер интерфейс.

Когда вы объявляете переменную следующим образом:

java.io.Serializable s1 = null;

Вы не создали ни одного Object.

Компилятор знает, что s1 и s2 будут реализовывать Serializable и будут переходить от Object, поэтому он допускает equals.

0 голосов
/ 29 апреля 2009

Когда вы объявляете что-то вроде:

java.io.Serializable s1 = null;

не забывайте, что все в Java происходит от Object. Итак, здесь вы только говорите, что s1 это что-то (либо Object или какой-то класс, расширяющий Object), что implements Serializable. Там нет магии. Все в Java происходит от Object, является ли оно явным или нет. Таким образом, метод equals всегда доступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...