>  기사  >  Java  >  Java 제네릭의 유형 매개변수를 바인딩하는 데 \'super\' 키워드를 사용할 수 없는 이유는 무엇입니까?

Java 제네릭의 유형 매개변수를 바인딩하는 데 \'super\' 키워드를 사용할 수 없는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-01 09:21:02939검색

Why can't the 'super' keyword be used to bound type parameters in Java generics?

'super' 키워드를 사용한 경계 제네릭: 자세한 설명

질문: 'super' 키워드를 사용할 수 없는 이유는 무엇입니까? 와일드카드와 달리 바인딩된 유형 매개변수는 무엇입니까?

답변:

유형 매개변수를 'super'(예: '')로 바인딩하는 것은 허용되지 않습니다. Java는 유형 바인딩에 사실상 무시할 만한 영향을 미치고 의도한 목적에 부합하지 않기 때문입니다.

다음 가상 코드를 고려하십시오.

interface Collection<T> {
    <S super T> S[] toArray(S[] a);
}

이 코드는 'toArray' 메소드를 제안합니다. 'Collection' 인터페이스에는 'T'의 상위 유형인 'S' 유형 매개변수가 있어야 합니다. 그러나 이 경계는 모든 유형이 'Object'의 상위 유형이고 모든 참조 유형의 배열이 'Object[]'로 캐스팅될 수 있기 때문에 의미가 없습니다. 컴파일러는 모든 배열이 인수로 전달되도록 허용합니다. 의도된 하위 유형인지 여부에 관계없이 'toArray'.

따라서 'super'를 사용하여 유형 매개변수를 바인딩해도 'ArrayStoreException'과 같은 런타임 오류를 방지할 수 없습니다. 따라서 Java의 유형 시스템에서는 허용되지 않습니다.

예:

가상의 일반 메소드를 고려하십시오.

<T super Integer> void add(T number)

이 메소드는 '정수', '숫자' 및 '객체'(모두 '정수'의 상위 클래스이므로) 추가를 허용하지만 '문자열'은 허용하지 않습니다. 그러나 'Object'는 'Integer'의 슈퍼클래스이므로 암시적 캐스팅으로 인해 '문자열'이 추가될 수 있으며 이로 인해 런타임 오류가 발생할 수 있습니다.

추가 고려 사항:

  • 제네릭과 배열: 제네릭과 배열에는 본질적인 한계가 있으며 원활하게 혼합되지 않습니다.
  • 'super' 사용의 대안: 이러한 시나리오에서 유형 안전성을 얻으려면 'super'로 유형 매개변수를 경계화하는 대신 와일드카드나 메서드 오버로드를 사용하는 것이 좋습니다.

관련 리소스:

  • Java 자습서/일반

    • 하위 입력
    • 와일드카드를 사용하여 더 재미있게
  • Java Generics: PECS란 무엇인가요? (생산자는 소비자 super를 확장합니다)
  • Java Generics에서 super와 확장의 차이점은 무엇입니까

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

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