Oracle 웹 사이트에서 Java 유형 삭제 에 대해 읽었습니다 .
타입 삭제는 언제 발생합니까? 컴파일 타임이나 런타임에? 수업이로드되면? 수업이 언제 시작됩니까?
많은 사이트 (위에서 언급 한 공식 튜토리얼 포함)는 컴파일시에 타입 삭제가 발생한다고 말합니다. 컴파일시에 타입 정보가 완전히 제거되면, 타입 정보가 없거나 잘못된 타입 정보로 제네릭을 사용하는 메소드가 호출 될 때 JDK는 어떻게 타입 호환성을 검사합니까?
다음 예제를 고려하십시오. 클래스 A
에 메소드가 있다고 가정하십시오 empty(Box<? extends Number> b)
. 우리는 컴파일 A.java
하고 클래스 파일을 얻습니다 A.class
.
public class A {
public static void empty(Box<? extends Number> b) {}
}
public class Box<T> {}
이제 매개 변수가없는 인수 (원시 유형)로 B
메서드를 호출하는 다른 클래스 를 만듭니다 . 우리가 컴파일하는 경우 와 클래스 패스에, javac의 경고를 높이기 위해 스마트 충분히입니다. 그래서empty
empty(new Box())
B.java
A.class
A.class
이 그 안에 저장된 어떤 종류의 정보를.
public class B {
public static void invoke() {
// java: unchecked method invocation:
// method empty in class A is applied to given types
// required: Box<? extends java.lang.Number>
// found: Box
// java: unchecked conversion
// required: Box<? extends java.lang.Number>
// found: Box
A.empty(new Box());
}
}
내 생각 엔 클래스가로드 될 때 유형 지우기가 발생하지만 추측 일뿐입니다. 언제 발생합니까?