IT TIP

인터페이스에서 자바 캐스팅

itqueen 2020. 10. 22. 23:48
반응형

인터페이스에서 자바 캐스팅


누군가 컴파일러가 첫 번째 캐스팅에서 불평하지 않고 두 번째 캐스팅에서 불평하는 방법을 설명해 주시겠습니까?

interface I1 { }
interface I2 { }
class C1 implements I1 { }
class C2 implements I2 { }

public class Test{
     public static void main(){
        C1 o1 = new C1();
        C2 o2 = new C2();
        Integer o3 = new Integer(4);

        I2 x = (I2)o1; //compiler does not complain
        I2 y = (I2)o3; //compiler complains here !!
     }
}

o1및을 사용 o3하여 캐스트 (I2)하면 객체의 클래스가 실제로 선언 된 유형의 하위 클래스이고이 하위 클래스가 I2.

Integer클래스는 최종 , 그래서 o3의 서브 클래스의 인스턴스가 될 수 없습니다 Integer: 컴파일러가 당신이 거짓말 것을 알고있다. C1그러나 최종적인 것은 아니므 로을 구현 하는 하위 유형의 인스턴스 o1 있습니다 .C1I2

당신이 할 경우 C1최종 컴파일러는 너무 불평 할 것이다 :

interface I1 { }
interface I2 { }
final class C1 implements I1 { }
class C2 implements I2 { }

public class Test{
     public static void main(){
        C1 o1 = new C1();
        C2 o2 = new C2();
        Integer o3 = new Integer(4);

        I2 y = (I2)o3; //compiler complains here !!
        I2 x = (I2)o1; //compiler complains too
     }
}

JLS 5 장 에 따르면

5.5.1. 참조 유형 주조

컴파일 시간 참조 유형 S (소스) 및 컴파일 시간 참조 유형 T (대상)가 주어지면 다음 규칙으로 인해 컴파일 시간 오류가 발생하지 않으면 S에서 T로 캐스팅 변환이 존재합니다. T가 인터페이스 유형 인 경우 :

S가 최종 클래스 (§8.1.1)가 아닌 경우 T의 상위 유형 X와 S의 상위 유형 Y가있는 경우 X와 Y가 모두 분명하게 구별되는 매개 변수화 된 유형이며 X가 삭제되도록합니다. 와 Y가 같으면 컴파일 타임 오류가 발생합니다.

그렇지 않으면 캐스트는 컴파일 타임에 항상 합법적입니다 (S가 T를 구현하지 않더라도 S의 하위 클래스가 될 수 있기 때문입니다).

S가 최종 클래스 (§8.1.1) 인 경우 S는 T를 구현해야합니다. 그렇지 않으면 컴파일 타임 오류가 발생합니다.


그 이유는 수업 Integer이 최종이고 C1그렇지 않기 때문 입니다. 따라서 Integer 객체는 I2를 구현할 수 없지만 C1 객체는 I2를 구현하는 C1의 하위 클래스 인스턴스 인 경우 가능합니다.


에 따르면 JLS 5.5.1 - 참조 타입 캐스팅 , 규칙 (들) 적용

  • T가 클래스 유형이면 | S | <: | T | 또는 | T | <: | S |. 그렇지 않으면 컴파일 타임 오류가 발생합니다.

    I2 y = (I2)o3; //compiler complains here !!

이 경우, Integer그리고 I2있습니다 무관 컴파일 타임 오류가 발생하므로, 어떤 방법이다. 있기 때문에, Integer이다 final, 사이에 관계가 없다 Integer하고 I2.

I2I1모두 마커 인터페이스 것에 (어떤 계약 없다) 때문에 관련 될 수있다.

컴파일 된 코드의 경우 규칙은 다음과 같습니다.

  • S가 최종 클래스 (§8.1.1)가 아닌 경우 T의 상위 유형 X와 S의 상위 유형 Y가있는 경우 X와 Y가 모두 분명하게 구별되는 매개 변수화 된 유형이며 X가 삭제되도록합니다. 와 Y가 같으면 컴파일 타임 오류가 발생합니다.

S이다 o1하고 T있다 I2.

도움이 되었기를 바랍니다.

참고 URL : https://stackoverflow.com/questions/16186474/java-casting-in-interfaces

반응형