> Java > java지도 시간 > Java 제네릭의 공분산, 반공분산, 확장 및 수퍼 선택 방법

Java 제네릭의 공분산, 반공분산, 확장 및 수퍼 선택 방법

PHPz
풀어 주다: 2023-05-26 13:46:12
앞으로
1330명이 탐색했습니다.

공분산과 반공분산을 이해하려면 먼저 다음을 소개해야 합니다.

리스코프 대체 원리에 따르면 C가 P의 하위 클래스인 경우 P는 C를 대체할 수 있습니다. 즉, P p = new C();
C는 P로부터 상속받고, C < P

불변이란 무엇입니까

F가 불변이라면 C <= P이면 F(C)와 F(P)는 상속 관계가 없습니다

예를 들어 Integer는 Liskov 대체 원칙에 따라 Number의 하위 클래스입니다

981211435beec535f89f0cb45b2ad93f
  • 반공변성이란 무엇입니까

  • F가 반공변인 경우 C <= P이면 F(C) >= F(P) 🎜🎜🎜Java는 불변성을 공분산으로 변환하는 super를 제공합니다. 예: 🎜🎜rrreee🎜 이때 List<? super Number>는 <code>ArrayList<Object>로 볼 수 있습니다. code>의 상위 클래스 🎜🎜extends 및 super🎜🎜🎜먼저 Collection.add의 구현을 살펴보겠습니다. 🎜🎜rrreee🎜🎜다음 코드는 오류를 보고합니까? 🎜? extends NumberInteger 유형과 일치하지 않습니다🎜rrreee🎜우선 add 메소드를 호출하면 일반 E가 자동으로 <? 확장 Number>🎜🎜두 번째 줄은 오류를 보고합니다. 이는 ? 확장 NumberInteger의 상위 클래스가 아님을 의미합니다. 여기서는 List Extensions Number>ArrayList<integer></integer>의 상위 클래스라는 것을 구별해야 합니다. 🎜🎜?extendsNumber는 Number의 특정 하위 클래스를 나타내는 유형 범위의 특정 유형으로 간주될 수 있지만 어떤 하위 클래스인지는 확실하지 않습니다. 또는 Integer의 하위 클래스입니다(Integer는 final에 의해 수정되며 하위 클래스를 가질 수 없습니다. 이는 단지 가상적인 상황일 뿐입니다). 이는 상한을 Number로 결정하고 하한을 결정하지 않습니다(? 확장 Number < Integer), 따라서 ? 확장 NumberInteger🎜🎜🎜의 상위 클래스가 아닙니다. 위의 코드를 수정하면 정확해질 것입니다. 오류: 🎜🎜rrreee🎜우선 반전으로 인해 List<? super Number>가 <code>ArrayList<Object>의 상위 클래스입니다. code>이고 첫 번째 줄이 정확합니다. 🎜🎜두 번째 줄: <code>? super NumberInteger의 상위 클래스입니다. 이유는: ? super Number는 다음의 특정 상위 클래스를 나타냅니다. Number는 Serialize 또는 Object일 수 있지만 어느 것이든 Number의 상위 클래스는 Integer의 상위 클래스여야 하므로 두 번째 줄도 정확합니다. .extends 또는 super를 사용해야 합니까? 🎜🎜🎜java.util.Collections(JDK1.7)의 복사 방법이 답을 제공합니다: 🎜🎜rrreee🎜🎜🎜일반 클래스에서 데이터를 가져오려면 확장을 사용하세요. 🎜🎜🎜🎜일반 클래스에 데이터를 쓰려면 super를 사용하세요. 🎜🎜🎜🎜가져오기와 쓰기를 모두 수행하려면 와일드카드가 필요하지 않습니다(즉, 확장이나 슈퍼가 사용되지 않음) 🎜🎜🎜rrreee

    위 내용은 Java 제네릭의 공분산, 반공분산, 확장 및 수퍼 선택 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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