Java 제네릭은 모든 제네릭이 객체로 표시되도록 유형 삭제를 통해 제네릭 유형 정보를 제거합니다. 유형 삭제를 사용하면 제네릭 메서드를 재정의하여 다양한 제네릭 유형 간에 서로 다른 동작을 달성할 수 있습니다. 이를 통해 일반 컨테이너의 통합, 공변 반환 값 및 반공변 매개변수 구현, Java 제네릭의 유연성을 최대한 활용할 수 있습니다.
Java의 제네릭은 유형 변수를 사용하여 컴파일러 수준에서 코드를 매개변수화함으로써 강력한 유형 안전성과 코드 재사용을 제공합니다. 그러나 Java에서 제네릭이 작동하는 방식을 이해하는 것은 기본 메커니즘을 이해하는 데 중요합니다.
Java 컴파일러는 유형 삭제를 사용하여 제네릭을 구현합니다. 이는 일반 유형 정보가 컴파일 타임에 바이트코드에서 제거됨을 의미합니다. 런타임 시 모든 유형은 기본 유형으로 표시되며 모든 유형 매개변수(예: 8742468051c85b06f0a0af9e3e506b5c
)는 Object
로 대체됩니다. 8742468051c85b06f0a0af9e3e506b5c
)都会替换为 Object
。
例如,考虑以下泛型方法:
<T> T max(T x, T y) { // ... }
在编译时,此方法将被类型擦除并转换为以下字节码:
max(Object x, Object y) { // ... }
泛型类型参数无法在运行时访问。然而,使用类型擦除,Java 编译器允许对泛型方法进行重写,在不同的泛型类型之间实现不同的行为。
例如,考虑以下两个重载方法:
public static <T extends Number> void print(T value) { // ... } public static void print(Object value) { // ... }
尽管第一个方法是泛型的,但它们在运行时都将被编译成相同的字节码,如下所示:
public static void print(Object value) { // ... }
因此,在编译时,泛型类型变量 {T extends Number}
会被擦除为 Object
,并且重写会被解析为针对 Object
rrreee
Generic overrides{T extends Number}
는 Object
로 지워지고 재정의는 대상 Object
유형 실행으로 확인됩니다. 위 내용은 Java 함수 제네릭의 고급 사용: 유형 삭제 및 제네릭 재정의의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!