java에서 클래스와 비슷한 인터페이스는 유형입니다. 당신의 예제와 클래스 A의 객체는 유형 A이고 유형 I입니다. 클래스 B의 객체는 유형 B, 유형 (유형 A) 및 유형 I입니다. 유형 C의 객체는 유형 C, 유형 O (유형) B, 유형 O (하위 유형) A 유형과 I 유형 중 하나입니다. 주목할만한 바와 같이, 객체는 두 가지 유형 (두 가지 유형이 서로 연결되어 있지 않습니다. 즉, A와 I는 독립적 인 유형입니다)과 각각의 수퍼 클래스의 부속 유형입니다.
Leskov의 대체 원칙에 따라 수퍼 유형 (수퍼 클래스) 대신 하위 유형 (하위 클래스)을 선적 할 수 있습니다. 아래의 코드에서 보면 설명하기 :
공용 클래스 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를 가질 수 있지만 상속 계층 구조에 완전히 연결되어 있지 않습니다. 일반적으로 두 개의 연결되지 않은 유형간에 변환해야하는 경우 전송해야합니다.
참고 : 나는 다른 클래스 D에게 주를 포함하도록 코드를 편집 한 : 나는 다른 클래스의 E 라인 세를 들어
을 포함하는 코드를 편집 한,이 컴파일시 오류를 일으키는 * 캐스트 *이 아니다 - A 타입의 변수에 컴파일 타임 타입'I'의 값을 할당하려고 시도한 것입니다 ... –
2 번 라인에서, 당신은'B'가 아닌 객체를 가지고 있습니다. 그것을'B' 타입의 변수에 할당하십시오. 왜 이것이 런타임에 괜찮을까요? –
우리가 B @ david에 캐스팅했기 때문에 – Gpar