이 스 니펫에 ClassCastException
이 표시되지 않는 이유는 누군가가 나를 밝혀 주시겠습니까? 나는 내가 예상했던대로 왜 작동하지 않는지에 대해 엄격하게 관심이있다. 나는 이것이 나쁜 디자인인지 여부에 상관없이이 시점에서 신경 쓰지 않는다. Java에서 지연 클래스 캐스트?
public class Test {
static class Parent {
@Override
public String toString() { return "parent"; }
}
static class ChildA extends Parent {
@Override
public String toString() { return "child A"; }
}
static class ChildB extends Parent {
@Override
public String toString() { return "child B"; }
}
public <C extends Parent> C get() {
return (C) new ChildA();
}
public static void main(String[] args) {
Test test = new Test();
// should throw ClassCastException...
System.out.println(test.<ChildB>get());
// throws ClassCastException...
System.out.println(test.<ChildB>get().toString());
}
}
이
는 자바 버전, 컴파일하고, 출력을 실행합니다$ java -version
java version "1.7.0_17"
Java(TM) SE Runtime Environment (build 1.7.0_17-b02)
Java HotSpot(TM) 64-Bit Server VM (build 23.7-b01, mixed mode)
$ javac -Xlint:unchecked Test.java
Test.java:24: warning: [unchecked] unchecked cast
return (C) new ChildA();
^
required: C
found: ChildA
where C is a type-variable:
C extends Parent declared in method <C>get()
1 warning
$ java Test
child A
Exception in thread "main" java.lang.ClassCastException: Test$ChildA cannot be cast to Test$ChildB
at Test.main(Test.java:30)
에 캐스팅이 필요하지 않습니다하지만이 이전 질문을 생각 나게하고있어,
toString()
는 슈퍼 클래스의 메소드 있음을 추론하는 문제가 없습니다/대답, 어쩌면 도움이 될 것입니다 http://stackoverflow.com/q/6538058/630384 – DHall거기에 검사되지 않은 캐스트 경고가있는 이유가 있습니다. 그것은 문자 그대로 캐스팅이 런타임 검사를 유발하지 않을 수 있다는 것을 의미합니다. – millimoose