> 백엔드 개발 > C++ > 객체 지향 프로그래밍에서 공변성과 반공변성의 차이점은 무엇입니까?

객체 지향 프로그래밍에서 공변성과 반공변성의 차이점은 무엇입니까?

Linda Hamilton
풀어 주다: 2025-01-20 17:12:10
원래의
855명이 탐색했습니다.

What is the Difference Between Covariance and Contravariance in Object-Oriented Programming?

공분산과 반공분산에 대한 심층적인 이해

객체 지향 프로그래밍의 공변성과 반공변성은 유형 안전성을 유지하면서 다양한 상황에서 다양한 유형을 대체할 수 있게 해줍니다.

공분산

"수퍼 유형"(보다 일반적인)이 출력 위치(예: 반환 값)에서 "하위 유형"(보다 구체적)의 대체물로 사용되는 경우 공분산이 적용됩니다. 이 경우 상위 유형 목록을 하위 유형 목록에 할당할 수 있습니다.

<code class="language-java">List<Fruit> fruits = new ArrayList<>();
List<Apple> apples = fruits; // 协变:List<Apple> 是 List<Fruit> 的子类型</code>
로그인 후 복사

반공변성

입력 위치에서 "하위 유형"이 "상위 유형"을 대체하여 사용되는 경우(예: 메소드 매개변수로) 반공변성이 적용됩니다. 이 경우 하위 유형을 허용하는 람다 식을 상위 유형을 기대하는 람다 식에 전달할 수 있습니다.

<code class="language-java">Comparator<Apple> compareApples = (a, b) -> a.compareTo(b);
Comparator<Fruit> compareFruits = compareApples; // 逆变:Comparator<Apple> 是 Comparator<Fruit> 的子类型</code>
로그인 후 복사

'in' 및 'out' 키워드

제네릭의 "in" 및 "out" 키워드는 일반 매개변수의 변화를 지정하는 데 사용됩니다. "out"은 공분산을 의미하고 "in"은 반공분산을 의미합니다.

MyInterface 인터페이스의 예:

  • 공분산(반환 값):
<code class="language-java">interface MyInterface<out T> {
    T get(); // T 可以是 T 的原始类型的任何子类型
}</code>
로그인 후 복사
  • 반전(입력 매개변수):
<code class="language-java">interface MyInterface<in T> {
    void set(T value); // T 必须是 T 的原始类型的子类型
}</code>
로그인 후 복사

요약하자면, 공분산과 반공분산은 일반 유형의 의도된 사용을 기반으로 안전한 유형 대체를 허용하여 유형 안전성을 보장하는 동시에 코드 설계 유연성을 제공합니다.

위 내용은 객체 지향 프로그래밍에서 공변성과 반공변성의 차이점은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿