При пересмотре сертификационного экзамена Java SE 8 Programmer I (ранее OCA) я натолкнулся на следующее утверждение:
"Ссылка на интерфейс требует назначения явного преобразования. для ссылки на любой класс, даже тот, который реализует интерфейс. Ссылка на интерфейс требует, чтобы для ссылки на класс было назначено явное приведение. "
Я думаю, что это немного неточно, поскольку возможно назначить ссылку на интерфейс ссылке на класс Object без явного приведения.
interface Animal {}
public class Dog implements Animal {
public static void main(String[] args) {
Animal animal = new Dog();
Dog dog = animal; // Doesn't compile - requires explicit cast to Dog
Object o = animal; // Compiles
}
}
Это связано со связью между классом Object и интерфейсами, аналогичной описанной в в этом ответе относительно формата файла класса?
Из этого ответа относительно доступа к методам Java класса объектов с использованием ссылки на интерфейс, я резюмировал, что:
- Используя ссылку на интерфейс, вы можете получить доступ только к методам, определенным в интерфейсе, но не к указанным классам c методов.
- Вы можете получить доступ к методам класса Object через любую ссылку на интерфейс, потому что, хотя интерфейс не расширяется из класса Object, каждый интерфейс root в Java имеется неявное объявление методов, соответствующих каждому методу в классе Object.
JLS §9.2 - Члены интерфейса :
Если интерфейс не имеет прямых суперинтерфейсов, то интерфейс неявно объявляет метод абстрактного члена publi c с сигнатурой s, типом возврата r и выбрасывает условие t, соответствующее каждому методу открытого экземпляра m с сигнатурой s, тип возврата r и условие throws t, объявленное в Object, если только интерфейс явно не объявил метод с такой же сигнатурой, одинаковым типом возврата и совместимым предложением throws.