2013-04-01 2 views
1

Может ссылаться на ссылочную переменную класса Object, ссылаясь на ссылочную переменную интерфейса. Как мы знаем, интерфейс не может расширить какой-либо класс. Таким образом, наследование по умолчанию класса Object будет работать с таким сценарием или нет. Очевидно, ответ - да, но в чем логика этого?Наследование класса объектов с интерфейсами

public interface ToTest { 

    } 

    public class ToTestImpl implements ToTest{ 

    } 

    public class ToTestClass { 

     public static void main(String args[]){ 
      ToTest test = new ToTestImpl(); 
      Object o = test; 
      System.out.println(o); 
     } 
    } 

ответ

2

Логика в том, что каждый класс Java является потомком Object, независимо от каких-либо интерфейсов он реализует. Таким образом, любая ссылка может быть повышена до Object.

Механики, применяемые к вашему корпусу, указаны в §5.5.1. Reference Type Casting и §5.5.3. Checked Casts at Run Time JLS. Детали немного сложны, так как есть компоненты времени компиляции и времени выполнения. Соответствующая цитата:

Вот алгоритм для проверки времени выполнения типа R объекта, является ли назначение совместимо с типом T ...

Если R является интерфейсом:

  • Если T - тип класса, то T должен быть Object (§4.3.2), или исключение времени выполнения.
0

Да, это сработает. Потому что компилятор знает, что interfaces не предназначены для создания экземпляра. Поэтому, даже если вы присвоите interface ссылку на Object, очевидно, что любая реализация этого interface будет исходить от иерархии Object.

Смежные вопросы