2014-11-06 2 views
0

이 코드 보았다 컴파일 시간없이 즉, 안전한 캐스팅을 가지고 어떤 방법인터페이스 클래스 - 객체, 주조, 예외

  1. 을 찾으려고

    interface I{}  
    
    class A implements I{} 
    
    class B extends A{} 
    
    class C extends B{} 
    
    class ABC 
    { 
    
        public static void main(String args[]) 
        { 
         A a=new A(); 
         B b=new B();    
         a=(B)(I)b; //Line 1 
         b=(B)(I)a; //Line 2 
         a=(I)b;  //Line 3 
         I i=(C)a; //Line 4 
        } 
    } 
    

    또는 런타임 오류

  2. 캐스팅에 컴파일 타임 오류가 표시되는 경우
  3. 캐스팅에 런타임 예외가 표시되는 경우

아무도 나에게이 3 가지 개념을 설명 할 수 있습니까?

+0

을 포함하는 코드를 편집 한,이 컴파일시 오류를 일으키는 * 캐스트 *이 아니다 - A 타입의 변수에 컴파일 타임 타입'I'의 값을 할당하려고 시도한 것입니다 ... –

+1

2 번 라인에서, 당신은'B'가 아닌 객체를 가지고 있습니다. 그것을'B' 타입의 변수에 할당하십시오. 왜 이것이 런타임에 괜찮을까요? –

+0

우리가 B @ david에 캐스팅했기 때문에 – Gpar

답변

0

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 라인 세를 들어

+0

마지막 두 줄은 a = (D) i를 의미합니까? @Ironlca – Gpar

+0

@Gpar, 코드를 약간 편집했습니다. 강조하고 싶은 것은 D 유형의 객체입니다. 그러나 of 유형의 객체는 A 유형이 아닙니다 (A와 I는 두 가지 독립적 인 유형입니다). 컴파일시에이 라인은 런타임에 에러를 발생시키지 않습니다. – Ironluca

+0

나는 미안한 질문을하는 것이 바보일지도 모른다. 어째서 위선자는 i = d를 볼 수없고 d는 A 형이 될 수 없다. 그런 다음 런타임 예외가 아니라 컴파일 시간 오류를 보여줄 수 있는가? a = (A) d; @Ironluca – Gpar