캐스트 는 기술적으로 가능합니다. javac에서는 귀하의 경우와 다르지 않다는 것을 쉽게 입증 할 수 없으며 JLS는 실제로 이것을 유효한 Java 프로그램으로 정의하므로 오류 플래그를 잘못 지정합니다.
List
인터페이스 이기 때문 입니다. 따라서 Date
실제로 여기에 List
위장한 것을 구현 하는 하위 클래스를 가질 수 있습니다 . 예를 들면 다음과 같습니다.List
Date
public class SneakyListDate extends Date implements List<Foo> {
...
}
그리고:
List<Foo> list = new SneakyListDate();
Date date = (Date) list; // This one is valid, compiles and runs just fine
인스턴스가 예를 들어 메소드에서 온 경우 런타임 정보가 필요하므로 이러한 시나리오를 감지하는 것이 항상 가능한 것은 아닙니다. 그럼에도 불구하고 컴파일러에는 훨씬 더 많은 노력이 필요합니다. 컴파일러는 클래스 트리를 전혀 일치시킬 수 없기 때문에 절대적으로 불가능한 캐스트 만 방지합니다. 보시다시피 여기서는 그렇지 않습니다.
JLS에서는 코드가 유효한 Java 프로그램이어야합니다. 에서 5.1.6.1. 좁혀진 참조 변환 허용 :
, 축소 참조 변환은 참조 형식에서 존재하는 S
참조 형식에 T
경우 모두 다음 중이 사실 :
- [...]
- 다음 경우 중 하나 가 적용됩니다 .
- [...]
S
인터페이스 유형이고 T
클래스 유형이며 클래스 T
이름을 지정하지 않습니다 final
.
따라서 컴파일러 가 사례가 실제로 불가능하다는 것을 알 JLS에서이를 유효한 Java 프로그램으로 정의하므로 오류를 표시 할 수 없습니다.
경고 만 표시 할 수 있습니다.
List
여기서 특별한 것은 없습니다 .Date d = (Date) new Object();