>  기사  >  Java  >  Java의 제네릭 유형 보호 기능은 코드에 어떤 영향을 미치나요?

Java의 제네릭 유형 보호 기능은 코드에 어떤 영향을 미치나요?

WBOY
WBOY앞으로
2023-04-26 13:34:081202검색

제네릭을 사용하여 유형 차이를 보호하세요

C++ 언어에는 매개변수화된 유형으로 일반 버전을 작성할 수 있는 매우 유용한 템플릿 함수가 있어 컴파일러가 자동으로 다양한 유형에 대한 특정 버전을 생성할 수 있습니다. Java 언어에는 Generics라는 비슷한 기능이 있습니다. 클래스와 메소드를 작성할 때 일반적으로 특정 유형을 사용하며, 제네릭을 사용하여 유형을 매개변수화할 수 있으므로 보다 일반적인 코드를 작성할 수 있습니다.

많은 사람들이 C++ 템플릿과 Java 제네릭의 개념이 동일하다고 생각하지만 실제로 구현 메커니즘은 완전히 다릅니다. C++ 템플릿은 매크로 명령어 세트이며, 컴파일러는 각 유형에 대한 템플릿 코드의 복사본을 생성합니다. Java 제네릭의 구현은 기본적으로 유형 제한에 대한 구문 설탕인 "유형 삭제" 개념을 기반으로 합니다.

1. 일반 클래스

지원 클래스를 예로 들어 일반 지원 클래스를 정의합니다:

/** 通用支撑类 */@Getter@Setter@ToStringpublic class GenericHolder<T> {    /** 通用取值 */
    private T value;    /** 构造函数 */
    public GenericHolder() {}    /** 构造函数 */
    public GenericHolder(T value) {        this.value = value;
    }
}

2. 일반 인터페이스

일반 데이터 공급자 인터페이스 정의:

/** 数据提供者接口 */public interface DataProvider<T> {    /** 获取数据函数 */
    public T getData();
}

3. 일반 얕은 복사 기능 정의:

/** 浅拷贝函数 */public static <T> T shallowCopy(Object source, Class<T> clazz) throws BeansException {    // 判断源对象
    if (Objects.isNull(source)) {        return null;
    }    // 新建目标对象
    T target;    try {
        target = clazz.newInstance();
    } catch (Exception e) {        throw new BeansException("新建类实例异常", e);
    }    // 拷贝对象属性
    BeanUtils.copyProperties(source, target);    // 返回目标对象
    return target;
}

4. 일반 와일드카드

일반 와일드카드는 일반적으로 특정 유형의 실제 매개변수 대신 "?"를 사용합니다. 특정 유형이 확실하지 않은 경우 일반 와일드카드 "?"를 사용할 수 있습니다. 해당 유형의 특정 기능을 사용할 필요가 없고 Object 클래스의 기능만 사용할 경우 일반 와일드카드 "?"를 사용할 수 있습니다.

/** 打印取值函数 */public static void printValue(GenericHolder<?> holder) {
    System.out.println(holder.getValue());
}/** 主函数 */public static void main(String[] args) {
    printValue(new GenericHolder<>(12345));
    printValue(new GenericHolder<>("abcde"));
}

Java 사양에서는 일반 와일드카드 "?"를 사용하지 않는 것이 좋습니다. 위 함수는 다음과 같이 변경할 수 있습니다.

/** 打印取值函数 */public static <T> void printValue(GenericHolder<T> holder) {
    System.out.println(holder.getValue());
}

5 일반 상한 및 하한 경계

일반 사용 시 들어오는 일반 유형 유형 실제 매개변수에는 상한 및 하한 제한이 적용됩니다. 예를 들어 유형 실제 매개변수는 특정 유형의 상위 클래스 또는 특정 유형의 하위 클래스에서만 전달할 수 있습니다. 제네릭 유형의 상한 및 하한 선언은 제네릭 유형의 선언과 함께 배치되어야 합니다.

상한 와일드카드(확장):

상한 와일드카드는 "확장"이며, 지정된 유형이나 하위 클래스를 일반 매개변수로 받아들일 수 있습니다. 지정된 유형의 하위 클래스일 뿐만 아니라 특정 인터페이스를 구현해야 함을 지정하는 특수 형식도 있습니다. 예를 들어, List는 이것이 A의 특정 하위 클래스 목록이고 저장된 객체가 A 또는 A의 하위 클래스여야 함을 나타냅니다. List 목록의 경우 A 또는 A의 하위 클래스 개체를 추가할 수 없지만 A의 개체만 가져올 수 있습니다.

하한 와일드카드(super):

하한 와일드카드는 "super"이며, 지정된 유형이나 상위 클래스를 일반 매개변수로 받아들일 수 있습니다. 예를 들어, List는 이것이 A의 특정 상위 클래스 목록이고 저장된 객체가 A 또는 A의 슈퍼클래스여야 함을 나타냅니다. List 목록의 경우 A 또는 A의 하위 클래스 개체를 추가할 수 있지만 개체의 개체만 가져올 수 있습니다.

PECS(Producer Extends Consumer Super) 원칙:

생산자로서 데이터를 제공(읽기)할 때 상한 와일드카드(확장)를 사용하는 것이 적합합니다.

소비자로서 데이터를 소비(쓰기)할 때 적합합니다. 하한 와일드카드(슈퍼)를 사용합니다.

일일 코딩에서는 일반 유형의 상위 클래스를 제한하는 데 사용되는 상한 와일드카드(확장)가 더 일반적으로 사용됩니다. 예제 코드는 다음과 같습니다:

/** 数字支撑类 */@Getter@Setter@ToStringpublic class NumberHolder<T extends Number> {    /** 通用取值 */
    private T value;    /** 构造函数 */
    public NumberHolder() {}    /** 构造函数 */
    public NumberHolder(T value) {        this.value = value;
    }
}/** 打印取值函数 */public static <T extends Number> void printValue(GenericHolder<T> holder) {
    System.out.println(holder.getValue());
}

위 내용은 Java의 제네릭 유형 보호 기능은 코드에 어떤 영향을 미치나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제