IT박스

Java Generics에서 'super'와 'extends'의 차이점은 무엇입니까

itboxs 2020. 10. 13. 07:34
반응형

Java Generics에서 'super'와 'extends'의 차이점은 무엇입니까


이 질문에 이미 답변이 있습니다.

Java 제네릭을 배우려고합니다. 언제 사용 <T extends Foo>할지, 언제 사용할지 명확하지 않습니다 <T super Foo>. 이들 각각은 T에 대해 무엇을 의미합니까? I have <T extends Comparable>and <T super Comparable>, 이들 각각은 무엇을 의미합니까?

sun.com에서 여러 자습서를 읽었지만 여전히 길을 잃었습니다. 누군가 예를 들어 설명 할 수 있습니까?

감사!


효과적인 Java 2nd Edition, 항목 28을 참조하십시오.

PECS

P roducer의 전자 xtends, C onsumer S uper

매개 변수가 생산자 인 경우이어야 <? extends T>하고 소비자 인 경우 이어야 합니다 <? super T>.

Google Collections를 살펴보면 Bloch가 있으므로 사용 방법을 알고 있습니다.)


허용하는 상속 계층 구조에 따라 다릅니다. "Grandparent"에서 상속 된 "Parent"에서 상속 된 "Child"클래스가 있다고 가정합니다.

<T extends Parent><T super Parent>부모 또는 조부모 받아들이는 동안 부모 또는 자식을 받아들입니다.


세 가지 유형의 와일드 카드가 있습니다.

  • ? extends Type: 유형의 하위 유형 패밀리를 나타냅니다 Type. 가장 유용한 와일드 카드입니다.
  • ? super Type: 유형의 상위 유형 패밀리를 나타냅니다 Type.
  • ?: 모든 유형 또는 임의의 집합을 나타냅니다.

저에게 가장 좋은 대답은 밥 삼촌의 기사를 읽을 때 @BSingh에서 나왔습니다. 여기서 기사의 결론을 다시 시작합니다.

목록 때마다 List <T super Suit>를 사용하세요 .

객체를 목록에 넣을 때 관심있는 것은 객체가 목록이 보유한 유형과 호환되는 유형이라는 것입니다. 따라서 목록이 해당 객체의 유형 또는 해당 객체의 수퍼 클래스를 취하기를 원합니다.

목록 에서 읽을 때마다 List <T extends Suit>를 사용하십시오 .

반면에 목록에서 읽을 때 읽고있는 유형이 목록에 포함 된 유형이거나 해당 유형에서 파생 된 유형이되기를 원합니다.


유형 매개 변수에 대해 묻는 경우 <T super X>Java 에는 구성 이 없습니다 . 바인딩 된 매개 변수는에만 가능 extend하지만 둘 이상의 유형을 확장 할 수 있습니다.

public class MyClass< T extends Closeable & Runnable >
{
  // Closeable and Runnable are chosen for demonstration purposes only
}

이 경우에는 MyClass< ConcreteT >ConcreteT를 다음과 같이 선언해야합니다.

public class ConcreteT
  implements Closeable, Runnable
{
   ...
}

제한된 와일드 카드의 경우이 문서를 읽어 보세요. get-put 원칙대한 섹션을 읽으십시오 . 기본적으로, super에 대응하는 write의미와 extends에 대응하는 read시맨틱.


PECS를 기억하십시오-생산자는 소비자 지원을 확장합니다. 또한 Bob 삼촌은 그의 장인 시리즈에서 잘 설명합니다. http://objectmentor.com/resources/articles/The_Craftsman_44__Brown_Bag_I.pdf를 확인하십시오.

참고 URL : https://stackoverflow.com/questions/1910892/what-is-the-difference-between-super-and-extends-in-java-generics

반응형