>  기사  >  Java  >  Java 함수 제네릭의 고급 사용: 유형 삭제 및 제네릭 재정의

Java 함수 제네릭의 고급 사용: 유형 삭제 및 제네릭 재정의

WBOY
WBOY원래의
2024-04-27 08:36:02742검색

Java 제네릭은 모든 제네릭이 객체로 표시되도록 유형 삭제를 통해 제네릭 유형 정보를 제거합니다. 유형 삭제를 사용하면 제네릭 메서드를 재정의하여 다양한 제네릭 유형 간에 서로 다른 동작을 달성할 수 있습니다. 이를 통해 일반 컨테이너의 통합, 공변 반환 값 및 반공변 매개변수 구현, Java 제네릭의 유연성을 최대한 활용할 수 있습니다.

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

컴파일 시간에 이 메서드는 유형이 지워지고 다음 바이트 코드로 변환됩니다.

rrreee

Generic overrides
  • 일반 유형 매개변수는 런타임에 액세스할 수 없습니다. 그러나 유형 삭제를 사용하면 Java 컴파일러는 제네릭 메소드를 재정의하여 다양한 제네릭 유형 간에 서로 다른 동작을 달성할 수 있도록 합니다. 예를 들어 다음 두 가지 오버로드된 메서드를 고려하세요.
  • rrreee
  • 첫 번째 메서드는 일반이지만 둘 다 다음과 같이 런타임에 동일한 바이트코드로 컴파일됩니다. rrreee따라서 컴파일 타임에 일반 유형 변수는 {T extends Number}Object로 지워지고 재정의는 대상 Object 유형 실행으로 확인됩니다.
  • 실용 사례다음은 유형 삭제 및 일반 재작성을 활용한 몇 가지 실용적인 사례입니다.

통합 범용 컨테이너: 🎜일반 목록이나 맵을 사용하면 다른 유형의 객체를 저장하고 동일한 작업을 적용할 수 있습니다. 종류별로 별도의 용기를 사용하세요. 🎜🎜🎜공변 반환 값: 🎜일반 재정의를 사용하면 공변 반환 값 메서드를 구현할 수 있습니다. 즉, 하위 클래스 재정의 메서드는 부모 클래스 재정의 메서드보다 더 구체적인 유형을 반환할 수 있습니다. 🎜🎜🎜반공변 매개변수: 🎜일반 재정의는 반공변 매개변수도 지원합니다. 즉, 하위 클래스 재정의 메서드의 매개변수는 상위 클래스 재정의 메서드보다 더 일반적인 유형일 수 있습니다. 🎜🎜🎜유형 삭제 및 일반 재작성을 이해하는 것은 Java 제네릭에 대한 깊은 이해의 기초입니다. 이러한 메커니즘을 이해함으로써 개발자는 유연하고 유형이 안전한 코드를 작성하고 Java의 제네릭 기능을 최대한 활용할 수 있습니다. 🎜

위 내용은 Java 함수 제네릭의 고급 사용: 유형 삭제 및 제네릭 재정의의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.