인터페이스에서 자바 캐스팅
누군가 컴파일러가 첫 번째 캐스팅에서 불평하지 않고 두 번째 캐스팅에서 불평하는 방법을 설명해 주시겠습니까?
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.
I2및 I1모두 마커 인터페이스 것에 (어떤 계약 없다) 때문에 관련 될 수있다.
컴파일 된 코드의 경우 규칙은 다음과 같습니다.
- 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
'IT TIP' 카테고리의 다른 글
| C #에서 myCustomer.GetType ()과 typeof (Customer)의 차이점은 무엇입니까? (0) | 2020.10.22 |
|---|---|
| Django 디버그는 페이지의 모든 변수를 표시합니다. (0) | 2020.10.22 |
| Cloudfront에서 정적으로 호스팅되는 웹 사이트의 하위 디렉터리에 대한 기본 루트 개체를 어떻게 설정합니까? (0) | 2020.10.22 |
| 어떤 C ++ 함정을 피해야합니까? (0) | 2020.10.22 |
| C #이 C ++보다 정말 느린가요? (0) | 2020.10.22 |