В java интерфейс, похожий на класс, является типом. В вашем примере и объект класса A имеет тип A и является типом I. Объект класса B имеет тип B, тип (подтип) A и тип I. Объект класса C относится к типу C, типа (подтипа) B, типа (подтип) A и тип I. Как уже отмечалось, объекты являются типами двух типов (те два типа не имеют никакой связи друг с другом, то есть A и I являются независимо типами) и подтипами их соответствующих суперклассов.
В соответствии с директивой замещения Лескова вы можете использовать подтип (подкласс) вместо супертипа (суперкласса). Для того, чтобы проиллюстрировать взгляд на фрагменте кода ниже:
общественного класса InheritanceTest {
public interface I{}
public class A implements I{}
public class B extends A{}
public class C extends B{}
public class D implements I{}
public class E{}
public void method(){
A a=new A();
B b=new B();
C c=new C();
D d=new D();
I i=null;
i=a;i=b;i=c;
a=b;
b=c;
a=c;
a=(A)i;//a=i does not work, A and I are two different types
i=d;
a=(A)i;//ClassCastException at runtime, D is not an A
E e=new E();
//a=(A)e; - this generates a compile time error
}//method closing
} // закрытие класс
Бросок необходимо, потому что, в соответствии с кодом, все как есть лишь все Является ли это не тем, что я мог бы иметь класс D, который реализовал I, но полностью не связан с иерархией наследования A. В общем, тогда, когда вам нужно преобразовать между двумя несвязанными типами, вам нужно сделать бросок.
Примечания: Я редактировал код, чтобы включить еще один класс D ПРИМЕЧАНИЯ: Я редактировал код, чтобы включить еще один класс E
Для третьей линии, это не * литой *, что вызывает сбой во время компиляции - это попытка присвоить значение типа компиляции 'I' переменной типа' A' ... –
В строке 2 у вас есть объект, который НЕ является 'B', и вы пытаетесь присвойте ему переменную типа 'B'. Почему все это будет в порядке во время выполнения? –
Потому что мы отдали его B @david – Gpar