2016-06-02 3 views
0

моя структура выглядит следующим образом:литья подкласса Субинтерфейса осуществляется SuperClass

interface SuperInterface{} 

interface SubInterface extends SuperInterface{} 

abstract class BaseClass implements SuperInterface{} 

class SubClass extends BaseClass {} 

и то, что я хочу сделать, это бросить подкласс Субинтерфейс

SubInterface instanceOfSubClass = (SubInterface) new SubClass(); 

, но я получаю исключение заброса.

поэтому почему я не могу отличить SubInterface от того, что он расширяет SuperInterface и ничего не добавляет? это просто обертка для суперинтерфейса который реализуется BaseClass

+0

«Почему я не могу отбросить SubInterface, даже если он расширяет SuperInterface и не добавляет ничего» Поскольку «SubInterface» не совпадает с «SuperInterface»: это разные классы. Зачем вам «SubInterface» в первую очередь? –

ответ

3

«SubClass» наследует от BaseClass, который реализует суперинтерфейс

Так «SubClass» соответствует типам «BaseClass» и «суперинтерфейс»

Вы не можете бросить на «SubInterface», потому что SubInterface - это другой тип. Даже если вы не добавить какую-либо функции к нему и просто использовать IST как обертке, это эс другого типа

SuperInterface 
    -BaseClass 
     --SubClass 
    -SubInterface 

Вы можете увидеть, SubClass не в пути наследования Субинтерфейса

0

См здесь нет никакой связи между SubInterface & SubClass

так, очевидно, в то время как вы собираетесь бросить его друг другу и/или родитель-ребенок, то он будет бросать ClassCastException

См, Белу w Диаграмма для четкого понимания.

enter image description here

1

иерархия выглядит, что

 
         SuperInterface 
          | 
     --------------------------------------- 
     |          | 
     SubInterface       | 
              BaseClass     
               | 
               | 
              SubClass 

И, как видно из этой диаграммы, SubClass не имеет никакого отношения к SubInterface, следовательно, вы не можете быть отлиты в SubInterface

1

Вы получаете исключение, поскольку SubClass не является SubInterface. Иерархия выглядит следующим образом:

SuperInterface 
    BaseClass 
     SubClass 

Для того, чтобы сделать эту работу BaseClass должен реализовать SubInterface. Иерархия будет выглядеть следующим образом:

SuperInterface 
    SubInterface 
     BaseClass 
     SubClass 

и вы могли бы бросить SubClass к SubInterface.

+0

BaseClass - это сторонняя библиотека, я не могу ее изменить (superInterface также является сторонней библиотекой), поэтому я обертываю их – Tal

+0

Я вижу, это действительно проблема. – Kagemusha

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