2015-05-24 2 views
-1

Представьте, что у нас есть класс C, который реализует интерфейсы I и J, объявленные как;Java Interfaces Casting

I i = new C(); 

почему эти ошибки 3 не дают (особенно последний):

1) C c = (C)i; 
2) J j = (J)i; 
3) i = (I)null; 

заранее спасибо.

+0

Можете ли вы разместить подпись 'C'? –

+4

@JordiCastilla На основании вопроса, я думаю, мы можем смело предположить, что это 'класс C реализует I, J {}'. – Pshemo

ответ

1
  1. C c = (C)i;

    Поскольку i может содержать экземпляр типа C не существует никаких проблем с разрешительным компилятором литьем I в C ссылки типа (если отливка будет успешной во время выполнения мы будем уверены, что все методы от C ссылка будет поддерживаться экземпляром, который также будет иметь тип C или его подтип).

  2. J j = (J)i;

    Поскольку существует возможность (как в нашем случае), что экземпляр хранится в i будет также осуществлять J интерфейса компиляторов позволяет отливать между ссылками неродственных интерфейсов. Но если экземпляр, хранящийся в i, не будет реализовывать J, тогда мы получим ClassCastException по адресу runtime.

  3. i = (I)null;

    Ну, null могут быть назначены любой эталонным поэтому нет никаких проблем с предоставлением ему присваивается i или брось.

0

Первый работает, поскольку i является экземпляром C (даже если ссылка имеет тип I, но для литья ссылочный тип не имеет значения).

Второй работает, поскольку i является экземпляром C и, следовательно, также экземпляром J (поскольку C реализует J). Тип ссылки не подходит для кастинга.

0
  1. работает, потому что я является справочным переменная I, но содержит экземпляр C. Вы можете сбрасывать объект, если объект является экземпляром класса, на который вы производите.

  2. C реализует J и вы всегда разрешено базовому типу объекта.

  3. Я думаю, это потому, что i является ссылочной переменной, которая допускает нулевое значение, и вы даете ей значение null.

0

Как только вы создали объект и присвоили его i с инструкцией.

I i = new C(); 

Объект еще C, даже если переменная отсылая к ней определяется как И.

SO

C c = (C)i; 

просто назначает тот же объект новой переменной, которая определяется как C. И поскольку объект имеет тип C, проблем нет.

j = (J)i; 

просто присваивает один и тот же объект новой переменной, которая определена как J. И, как объект имеет тип С, который реализует интерфейс J он также типа J, поэтому нет никаких проблем.

i = (I)null; 

Просто устанавливает переменную i в значение null.