다른 답변을 작성할 때 investigating a stack trace discrepancy 동안 나는 이해하지 못하는 행동을 보았습니다.스택 추적의 신비한 라인
interface TestInterface <U> {
void test (U u);
}
static class Test <T extends Test<T>> implements TestInterface<T> { // line 11
@Override public void test (T t) {
throw new RuntimeException("My exception"); // line 13
}
}
static class TestA extends Test<TestA> { }
static class TestB extends Test<TestB> { }
public static void main (String[] args) throws Exception {
try {
Test a = new TestA();
Test b = new TestB();
a.test(b);
} catch (Exception x) {
x.printStackTrace(System.out);
}
try {
TestInterface a = new TestA();
Test b = new TestB();
a.test(b);
} catch (Exception x) {
x.printStackTrace(System.out);
}
try {
TestInterface a = new TestA();
TestInterface b = new TestB();
a.test(b);
} catch (Exception x) {
x.printStackTrace(System.out);
}
}
라인 (11)과 13 위의 코드에서 표시되어 있으며 run on ideone가 될 수 있습니다 (이 멀리 아래로 내가 범위를 좁힐 수 있습니다 같다)는 다음 테스트 프로그램을 고려하십시오. 이 프로그램의 출력은 다음과 같습니다
java.lang.RuntimeException: My exception
at Ideone$Test.test(Main.java:13)
at Ideone.main(Main.java:25)
java.lang.RuntimeException: My exception
at Ideone$Test.test(Main.java:13)
at Ideone$Test.test(Main.java:11)
at Ideone.main(Main.java:33)
java.lang.RuntimeException: My exception
at Ideone$Test.test(Main.java:13)
at Ideone$Test.test(Main.java:11)
at Ideone.main(Main.java:41)
내 질문은 : 왜 두 번째와 세 번째 테스트 케이스의 스택 트레이스 라인 (11)은? 세 테스트 케이스의 차이점은 a
및 b
의 선언 된 유형입니다.
라인 (11) (클래스 선언 행)은하기 조건 하에서 만 존재한다 : Test
이 인터페이스를 구현
- 경우와
- 예외는 인터페이스 방법에서 발생하는 경우와
- 인터페이스가 형식 매개 변수를 사용하는 경우
- 클래스 선언의 형식 매개 변수에
extends Test<T>
(class Test<T>
으로 선언 된 경우 줄 11은 포함되지 않음) 및 Test
유형 대신TestInterface
유형에서 메소드가 호출되는 경우. 그 주목
:
그것은 확실히 내 예외가 발생되고- (메시지 및 스택 추적).
- 광산을 던지지 않으면 다른 예외가 발생하지 않습니다.
- 필자는 Windows에서 Oracle JDK 1.7 및 1.8, Ideone에서 1.8을 사용하여이를 재현했습니다. 그러나 1.7에는 11 대신 2 행에 스택 추적 요소가 포함되어 있습니다 (두 배 이상입니다).
여기 무슨 일입니까? 그 라인은 스택 트레이스에서 어떻게 끝나고 두 오브젝트가 모두 Test
으로 선언되면 나타나지 않는 이유는 무엇입니까? a
가 Comparable
선언하지만 Enum
가 선언 될 때 존재하지 않는 경우 java.lang.Enum
라인 (55)이 존재
Here is the original program that prompted this
. 55 행은 JDK 소스에있는Enum
의 선언이고, 180 행은 명시 적으로
ClassCastException
을 던집니다.