>  기사  >  Java  >  Java Generics에서 유형 매개변수 경계에 \'super\' 키워드를 사용할 수 없는 이유는 무엇입니까?

Java Generics에서 유형 매개변수 경계에 \'super\' 키워드를 사용할 수 없는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-31 16:22:30182검색

Why Can't We Use 'super' Keyword for Type Parameter Bounds in Java Generics?

'super' 키워드를 사용한 경계 제네릭: 포괄적인 설명

Java 제네릭은 유형 안전성과 코드 재사용성을 허용합니다. 제네릭의 한 측면은 유형 매개변수가 특정 하위 유형 관계로 제한될 수 있는 유형 경계입니다. 그러나 와일드카드와 달리 'super' 키워드를 사용하여 유형 매개변수를 제한할 수 없습니다.

Collection 인터페이스에서 toArray 메소드는 'S'가 유형 매개변수인 'S[]' 유형의 인수를 사용합니다. 메소드가 ''로 선언되지 않은 이유에 대한 질문이 발생합니다. 와일드카드 '' 대신.

답은 '슈퍼' 경계 동작에 있습니다. 'super'는 일반적으로 와일드카드(<'? super T'>)와 함께 사용되지만 이를 유형 매개변수('> 대신 <'')에 적용하면 다음과 같습니다. 의도하지 않은 결과. Object는 모든 참조 유형의 슈퍼클래스입니다. 즉, 'Object[]'는 '<'S super T>>'에 대한 유효한 인수입니다. 컴파일 타임에. 이는 'T'의 하위 클래스가 아닌 참조 유형 인수도 전달될 수 있으므로 경계의 목적을 무산시킵니다.

따라서 유형 매개변수에 대한 '슈퍼' 경계는 이에 대한 예상되는 보호를 제공하지 않습니다. 잘못된 인수입니다. 설명을 위해, 가상의 방법 '<> S[] toArray(S[] a)' 및 '' 'Integer'는 'String'이 'Integer'의 슈퍼클래스가 아님에도 불구하고 여전히 'String[]' 유형의 인수를 허용합니다. 'String[]'은 'Object[]'이므로 'super' 경계를 충족합니다.

이러한 제한은 제네릭과 배열 간의 상호 작용에서 비롯됩니다. 제네릭과 배열은 서로 다른 공분산 규칙을 ​​갖고 있어 관찰된 동작으로 이어집니다.

이 제한은 유형 매개변수에만 적용된다는 점에 유의하는 것이 중요합니다. '<'?에서 볼 수 있듯이 가변성을 표현하기 위해 여전히 'super'를 사용하여 와일드카드를 바인딩할 수 있습니다. 슈퍼 T>' toArray 메소드를 사용하면 유연성이 향상됩니다.

제네릭 및 유형 경계에 대한 자세한 내용은 다음 리소스를 참조하세요.

  • Java 자습서/제네릭
  • Java Generics: PECS란 무엇입니까?
  • Java Generics에서 super와 확장의 차이점은 무엇입니까

위 내용은 Java Generics에서 유형 매개변수 경계에 \'super\' 키워드를 사용할 수 없는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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