C++ 언어에는 매개변수화된 유형으로 일반 버전을 작성할 수 있는 매우 유용한 템플릿 함수가 있어 컴파일러가 자동으로 다양한 유형에 대한 특정 버전을 생성할 수 있습니다. Java 언어에는 Generics라는 비슷한 기능이 있습니다. 클래스와 메소드를 작성할 때 일반적으로 특정 유형을 사용하며, 제네릭을 사용하여 유형을 매개변수화할 수 있으므로 보다 일반적인 코드를 작성할 수 있습니다.
많은 사람들이 C++ 템플릿과 Java 제네릭의 개념이 동일하다고 생각하지만 실제로 구현 메커니즘은 완전히 다릅니다. C++ 템플릿은 매크로 명령어 세트이며, 컴파일러는 각 유형에 대한 템플릿 코드의 복사본을 생성합니다. Java 제네릭의 구현은 기본적으로 유형 제한에 대한 구문 설탕인 "유형 삭제" 개념을 기반으로 합니다.
지원 클래스를 예로 들어 일반 지원 클래스를 정의합니다:
/** 通用支撑类 */@Getter@Setter@ToStringpublic class GenericHolder<T> { /** 通用取值 */ private T value; /** 构造函数 */ public GenericHolder() {} /** 构造函数 */ public GenericHolder(T value) { this.value = value; } }
일반 데이터 공급자 인터페이스 정의:
/** 数据提供者接口 */public interface DataProvider<T> { /** 获取数据函数 */ public T getData(); }
/** 浅拷贝函数 */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. 일반 와일드카드
/** 打印取值函数 */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의 하위 클래스 개체를 추가할 수 없지만 A의 개체만 가져올 수 있습니다.
하한 와일드카드(super):
하한 와일드카드는 "super"이며, 지정된 유형이나 상위 클래스를 일반 매개변수로 받아들일 수 있습니다. 예를 들어, List super A>는 이것이 A의 특정 상위 클래스 목록이고 저장된 객체가 A 또는 A의 슈퍼클래스여야 함을 나타냅니다. List super A> 목록의 경우 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!